如何将可选参数方法转换为c#中的委托

1 c# unity-game-engine

我有一个铸造问题.

public void Test(int a = 0) { }

System.Action d = Test;
Run Code Online (Sandbox Code Playgroud)

这段代码在团结中运作良好5.

但是visual studio 2015无法编译它.

CS0123'Test'没有超载匹配委托'Action'

为什么???

Dai*_*Dai 5

当调用具有可选参数的方法,它实际上是编译为一个呼叫这些参数的参数值,这些值确定由该方法的声明默认值.

如果你有一个声明和使用的方法如下:

public void Foo(String x = "foo", Int32 y = 123) {
    // do something
}

public void Bar() {
    Foo();
}
Run Code Online (Sandbox Code Playgroud)

然后编译它,看看你将看到Bar的实际上正在执行此操作的程序集中生成的CIL :(而不是编译器使用编译的CIL和调用约定执行某些voodoo,例如C风格的可变参数函数)

public void Bar() {
    Foo("foo", 123);
}
Run Code Online (Sandbox Code Playgroud)

(这也解释了为什么默认值必须是编译时常量(因为它们基本上是逐字放在调用代码中),你应该注意,如果在一个程序集中更改可选参数的默认值而不重新编译调用程序集然后将继续使用旧值(就像public const是).)

我的观点是具有可选参数的方法仍然是形式上多参数的方法,这就是为什么与参数的子集的委托不能绑定到它.

所以在你的情况下......

所以你需要提供另一个方法重载,它是一个真正的零参数,或者将它包装在一个匿名函数中:

public void Test(Int32 a = 0) {}
public void Test() {}

Action d = Test;
Run Code Online (Sandbox Code Playgroud)

要么:

Action d = () => Test();
Run Code Online (Sandbox Code Playgroud)