我试图将一个函数引用存储在Delegate类型中供以后使用。
这就是我正在做的事情:
class Program
{
static void Test()
{
}
static void Main(string[] args)
{
Delegate t= (Delegate)Test;
}
}
在此我收到以下错误:
无法转换方法组'测试'到非委托类型&System;系统管理员' 你打算调用这个方法吗?
为什么会这样?
答案 0 :(得分:7)
你真的不应该使用类型Delegate
来存储委托。您应该使用特定类型的委托。
几乎在所有情况下,您都可以使用Action
或Func
作为委托类型。在这种情况下,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
)。