我正在尝试将一个函数引用存储在Delegate类型中供以后使用.
这是我正在做的事情:
class Program
{
static void Test()
{
}
static void Main(string[] args)
{
Delegate t= (Delegate)Test;
}
}
Run Code Online (Sandbox Code Playgroud)
在这我得到以下错误:
无法将方法组'Test'转换为非委托类型'System.Delegate'.
你打算调用这个方法吗?
为什么会这样?
你真的不应该使用该类型Delegate来存储委托.您应该使用特定类型的委托.
在几乎所有情况下,您都可以使用Action或Func作为您的委托类型.在这种情况下,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)将很难,因为编译器将不再知道方法的签名是什么,因此它不知道应该将哪些参数传递给它.
你在这里尝试做的是将方法组转换 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).
| 归档时间: |
|
| 查看次数: |
27787 次 |
| 最近记录: |