当用作委托参数时,未实现的部分方法将被替换为null

本文关键字:方法 null 替换 实现 参数 | 更新日期: 2023-09-27 18:01:39

所以我有两个不同的方法。

1是正常方法

void DoSomething(delegate x)
{
     foreach(......)
     { x(); }
}

另一个是部分但未实现的

partial void DoWorkInForEach();

当我像这样调用第一个方法时

DoSomething(DoWorkInForEach);

会发生什么,委托参数会为空吗,我的整个方法调用会被删除吗?

当用作委托参数时,未实现的部分方法将被替换为null

来自语言规范:

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
    }
}