无法将方法组''转换为非委托类型'System.Delegate'。您是否打算调用该方法?

8
我是一个有用的助手,可以为您进行文本翻译。
我正在尝试将函数引用存储在Delegate类型中以备后用。
这是我的做法:
class Program
{
    static void Test()
    {

    }

    static void Main(string[] args)
    {
        Delegate t= (Delegate)Test;
    }
}

我在这里遇到了以下错误:
“无法将方法组'Test'转换为非委托类型'System.Delegate'。你打算调用该方法吗?”
为什么会出现这种情况?

委托是一个抽象类,而不是委托类型。你需要一个具体的委托类型,在这里使用Action是很好的选择。 - Hans Passant
2个回答

9
你在这里尝试做的是将方法组Test转换为某个东西。根据规范,方法组唯一合法的转换方式是将其转换为委托类型。可以通过显式转换来完成此操作:
var t = (Delegate)Test;

或者隐式地:

Delegate t = Test;

然而,正如文档所述,System.Delegate本身并不是委托类型:

Delegate类是委托类型的基类。但是,只有系统和编译器可以显式从Delegate类或MulticastDelegate类派生。也不允许从委托类型派生新类型。Delegate类不被视为委托类型;它是用于派生委托类型的类。

编译器会检测到这一点并进行投诉。
如果你想将方法组转换为委托,你需要指定具有兼容签名的委托类型(在本例中为Action)。

8

您不应该使用类型Delegate来存储委托。您应该使用特定类型的委托。

在几乎所有情况下,您可以使用ActionFunc作为委托类型。在这种情况下,Action是适当的:

class Program
{
    static void Test()
    {

    }

    static void Main(string[] args)
    {
        Action action = Test;

        action();
    }
}

您可以通过以下方式获取Delegate实例:
Delegate d = (Action)Test;

但是实际上使用一个 Delegate,而不是一个具体的委托类型,比如 Action,会很困难,因为编译器不再知道方法的签名,所以它不知道应该传递什么参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接