当用作委托参数时,未实现的部分方法将被替换为null
本文关键字:方法 null 替换 实现 参数 | 更新日期: 2023-09-27 18:01:39
所以我有两个不同的方法。
1是正常方法
void DoSomething(delegate x)
{
foreach(......)
{ x(); }
}
另一个是部分但未实现的
partial void DoWorkInForEach();
当我像这样调用第一个方法时
DoSomething(DoWorkInForEach);
会发生什么,委托参数会为空吗,我的整个方法调用会被删除吗?
来自语言规范:
10.2.7部分方法[…]
如果给出了定义声明,但没有给出实现声明对于部分方法M,适用以下限制:
•创建方法委托(§7.6.10.5)是编译时错误。
•它是在匿名函数中引用M会产生编译时错误转换为表达式树类型(第6.5.2节)。
•表达式作为M调用的一部分发生的情况不影响定义赋值状态(§5.3),这可能会导致编译时错误。
•M不能作为应用程序的入口点(§3.1)。
如果需要,您可以在这里使用lambda而不是method-group,后者实际上会给您一个无操作委托:
DoSomething(() => DoWorkInForEach());
理论
根据MSDN:
你可以委托给一个已经定义和实现的分部方法,但不能委托给一个只定义了的分部方法。
和c#语言规范:
如果给出了分部方法M的定义声明而没有实现声明,则适用以下限制:创建委托给方法(§7.6.10.5)是编译时错误。
下面是正确的:
partial class Foo
{
partial void Method();
Foo()
{
Action action = new Action(Method);
}
}
partial class Foo
{
partial void Method()
{
// ...
}
}
,下面将抛出编译错误:
不能从方法'Test.Foo.Method()'创建委托,因为它是一个没有实现声明的分部方法
partial class Foo
{
partial void Method();
Foo()
{
Action action = new Action(Method); // Compilation error
}
}