【问题标题】:Cannot convert method group '' to non-delegate type 'System.Delegate'. Did you intend to invoke the method?无法将方法组“”转换为非委托类型“System.Delegate”。您是否打算调用该方法?
【发布时间】:2013-02-18 17:21:07
【问题描述】:

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

这就是我正在做的事情:

class Program
{
    static void Test()
    {

    }

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

在此我收到以下错误:

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

为什么会这样?

【问题讨论】:

  • Delegate 是抽象类,不是委托类型。你需要一个具体的委托类型,Action 很好。

标签: c# delegates


【解决方案1】:

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

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

class Program
{
    static void Test()
    {

    }

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

        action();
    }
}

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

Delegate d = (Action)Test;

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

【讨论】:

    【解决方案2】:

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

    var t = (Delegate)Test;
    

    或隐含地:

    Delegate t = Test;
    

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-23
      • 2017-06-23
      • 2012-03-27
      • 1970-01-01
      • 1970-01-01
      • 2015-12-24
      • 1970-01-01
      相关资源
      最近更新 更多