7

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

这就是我正在做的事情:

class Program
{
    static void Test()
    {

    }

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

在此我收到以下错误:

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

为什么会这样?

4

2 回答 2

8

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

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

class Program
{
    static void Test()
    {

    }

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

        action();
    }
}

从技术上讲,您可以通过以下方式获得一个实例Delegate

Delegate d = (Action)Test;

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

于 2013-03-04T15:08:53.683 回答
7

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

var t = (Delegate)Test;

或隐含地:

Delegate t = Test;

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

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

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

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

于 2013-03-04T15:09:52.683 回答