所以我有两种不同的方法。
一种是正常的方法
void DoSomething(delegate x)
{
foreach(......)
{ x(); }
}
另一个是部分但未实现的
partial void DoWorkInForEach();
当我这样调用我的第一个方法时
DoSomething(DoWorkInForEach);
会发生什么,委托参数是否为空,我的整个方法调用会被删除吗?
所以我有两种不同的方法。
一种是正常的方法
void DoSomething(delegate x)
{
foreach(......)
{ x(); }
}
另一个是部分但未实现的
partial void DoWorkInForEach();
当我这样调用我的第一个方法时
DoSomething(DoWorkInForEach);
会发生什么,委托参数是否为空,我的整个方法调用会被删除吗?
从语言规范:
10.2.7 部分方法
[...]
如果为部分方法 M 给出了定义声明而不是实现声明,则适用以下限制:
•创建方法的委托是编译时错误(第 7.6.10.5 节)。
• 在转换为表达式树类型(第 6.5.2 节)的匿名函数中引用 M 是编译时错误。
• 作为 M 调用的一部分出现的表达式不会影响明确的赋值状态(第 5.3 节),这可能会导致编译时错误。
• M 不能是应用程序的入口点(第 3.1 节)。
如果需要,您可以在此处使用 lambda 而不是方法组,这实际上会给您一个无操作委托:
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
}
}