将泛型委托转换为具有相同签名的非泛型

本文关键字:泛型 转换 | 更新日期: 2023-09-27 17:54:45

必须是一个简单的问题。我定义了两个委托类型:

delegate void TestHandler(object sender, EventArgs args);
delegate void TestHandlerGen<TArgs>(object sender, TArgs args);

然后我使用它们:

TestHandler h1 = null;
TestHandlerGen<EventArgs> h2 = delegate { };
// this compiles
h1 = new TestHandler(h2);
// this doesn't compile:
// Cannot implicitly convert type 'X.TestHandlerGen<System.EventArgs>' 
// to 'X.TestHandler'
h1 = h2;

委托签名相同,为什么h1 = h2不能编译?

为什么h1 = new TestHandler(h2)编译得很好?

将泛型委托转换为具有相同签名的非泛型

从规格:

15.1委托声明

c#中的委托类型是名称等价的,而不是结构等价的。具体来说,两种不同的委托类型具有相同的参数列表和返回类型被认为是不同的委托类型

第一个示例可以工作,因为您可以从兼容的委托实例创建新委托。因此,虽然h2h1兼容,但由于它们具有不同的类型,因此它们并不相等:

7.6.10.5委托创建表达式

一个delegate- create -expression用于创建一个新的实例委托类型。delegate-creation-expression:

new delegate-type (expression)

的委托创建表达式的绑定时处理形式newD(E),其中D为委托类型,E为表达式,由以下步骤组成:

•如果E是一个值,则E必须与D兼容(§15.1),并且结果是对新创建的D类型委托的引用,它引用如果E与D不兼容,则a发生编译时错误。