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

时间:2013-03-04 15:07:04

标签: c# delegates

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

这就是我正在做的事情:

class Program
{
    static void Test()
    {

    }

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

在此我收到以下错误:

  

无法转换方法组'测试'到非委托类型&System;系统管理员'       你打算调用这个方法吗?

为什么会这样?

2 个答案:

答案 0 :(得分:7)

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

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

class Program
{
    static void Test()
    {

    }

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

        action();
    }
}

通过这样做,您可以在技术上获得Delegate的实例:

Delegate d = (Action)Test;

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

答案 1 :(得分:5)

您在此处尝试做的是将method group Test投射到某事物上。根据规范,方法组的唯一合法转换是将其转换为委托类型。这可以明确地完成:

var t = (Delegate)Test;

或隐含地:

Delegate t = Test;

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

  

Delegate类是委托类型的基类。但是,只有   系统和编译器可以从Delegate类中明确派生   或者来自MulticastDelegate类。它也是不允许的   从委托类型派生新类型。 Delegate类不是   被认为是代表类型;它是一个用于派生委托的类   类型。

编译器会检测到并抱怨。

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