c# - 如何在c#中将可选参数方法转换为委托(delegate)

标签 c# unity3d

我有一个类型转换问题。

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/

相关文章:

c# - 为一组随机值生成多个范围

c# - .net 中的可空类型是如何实现的?

c# - 如何从数据库生成下一个ID

c# - Xamarin 将 View 添加到布局但在屏幕上不可见

c# - 有没有一种方法可以在不分配任何内存的情况下对数组进行排序?

android - 如何将数据从 Unity 场景传递到 Android Activity

c# - 如何防止 SolidColorBrush 对象发生内存泄漏?

unity3d - 向 TextMeshPro 文本添加轮廓

android - 您的硬件不支持此应用程序。无法加载 "libmain.so"

unity3d - 无法在 Unity 的音频源中添加音频剪辑