无法将方法组''转换为非委托类型'System.Delegate'.你打算调用这个方法吗?

Ars*_*ray 6 c# delegates

我正在尝试将一个函数引用存储在Delegate类型中供以后使用.

这是我正在做的事情:

class Program
{
    static void Test()
    {

    }

    static void Main(string[] args)
    {
        Delegate t= (Delegate)Test;
    }
}
Run Code Online (Sandbox Code Playgroud)

在这我得到以下错误:

无法将方法组'Test'转换为非委托类型'System.Delegate'.
你打算调用这个方法吗?

为什么会这样?

Ser*_*rvy 7

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

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

class Program
{
    static void Test()
    {

    }

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

        action();
    }
}
Run Code Online (Sandbox Code Playgroud)

从技术上讲,您可以Delegate通过执行以下操作获取实例:

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

但实际上使用a Delegate而不是实际特定类型的委托(例如Action)将很难,因为编译器将不再知道方法的签名是什么,因此它不知道应该将哪些参数传递给它.


Jon*_*Jon 6

你在这里尝试做的是将方法组转换 Test为某种东西.根据规范,方法组的唯一合法转换是将其转换为委托类型.这可以明确地完成:

var t = (Delegate)Test;
Run Code Online (Sandbox Code Playgroud)

或隐含地:

Delegate t = Test;
Run Code Online (Sandbox Code Playgroud)

但是,正如文档所说,System.Delegate它本身就是...不是委托类型:

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

编译器检测到这一点并抱怨.

如果要将方法组强制转换为委托,则必须指定具有兼容签名的委托类型(在本例中Action).