2

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

一种是正常的方法

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

另一个是部分但未实现的

partial void DoWorkInForEach();

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

DoSomething(DoWorkInForEach);

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

4

2 回答 2

4

语言规范

10.2.7 部分方法

[...]

如果为部分方法 M 给出了定义声明而不是实现声明,则适用以下限制:

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

• 在转换为表达式树类型(第 6.5.2 节)的匿名函数中引用 M 是编译时错误。

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

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

如果需要,您可以在此处使用 lambda 而不是方法组,这实际上会给您一个无操作委托:

DoSomething(() => DoWorkInForEach());
于 2013-02-28T15:25:43.500 回答
1

理论

根据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
    }
}
于 2013-02-28T15:22:31.443 回答