我有一个类型转换问题。
public void Test(int a = 0) { }
System.Action d = Test;
此代码在 unity 5 中运行良好。
但visual studio 2015无法编译。
CS0123 No overload for 'Test' matches delegate 'Action'
为什么???
最佳答案
当调用带有可选参数的方法时,它实际上被编译为调用带有这些参数的参数值,这些值由方法声明的默认值决定。
如果你有一个像这样声明和使用的方法:
public void Foo(String x = "foo", Int32 y = 123) {
// do something
}
public void Bar() {
Foo();
}
然后编译它,并查看程序集中生成的 CIL,您会发现 Bar
实际上是这样做的:(与编译器对已编译的 CIL 执行一些巫术并调用 -约定,例如 C 风格的可变参数函数)
public void Bar() {
Foo("foo", 123);
}
(这也解释了为什么默认值必须是编译时常量(因为它们本质上是逐字放置在调用代码中的),并且您应该注意,如果您在一个程序集中更改可选参数的默认值而没有重新编译调用程序集,然后将继续使用旧值(就像 public const
一样)。)
我的观点是,具有可选参数的方法仍然是正式多参数方法,这就是为什么不能将具有参数子集的委托(delegate)绑定(bind)到它的原因。
所以在你的情况下......
所以你需要提供另一个方法重载,它是一个真正的零参数,或者将它包装在一个匿名函数中:
public void Test(Int32 a = 0) {}
public void Test() {}
Action d = Test;
或者:
Action d = () => Test();
关于c# - 如何在c#中将可选参数方法转换为委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44150058/