当用作委托参数时,unmplement部分方法是否被替换为null?

时间:2013-02-28 15:20:04

标签: c# .net methods delegates partial-methods

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

一个是常规方法

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

另一个是部分但未实现的

partial void DoWorkInForEach();

当我打电话给我这样的第一个方法时

DoSomething(DoWorkInForEach);

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

2 个答案:

答案 0 :(得分:4)

来自language specification

  

10.2.7部分方法

     

[...]

     

如果给出了定义声明但未给出实施声明   对于部分方法M,以下限制适用:

     

创建方法委托(第7.6.10.5节)是编译时错误。

     

•确实如此   一个编译时错误,用于引用匿名函数中的M   转换为表达式树类型(第6.5.2节)。

     

•表达   作为M的调用的一部分发生不影响确定   赋值状态(第5.3节),可能导致编译时   错误。

     

•M不能是应用程序的入口点(§3.1)。

如果需要,你可以在这里使用lambda而不是method-group,这实际上会给你一个no-op委托:

DoSomething(() => DoWorkInForEach());

答案 1 :(得分:1)

理论

根据MSDN

  

您可以委托已定义和实现的部分方法,但不能委托仅定义的部分方法。

还有C# Language Specification

  

如果为部分方法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
    }
}