使用相同签名转换委托给非泛型的泛型

时间:2014-03-28 15:17:30

标签: c# generics compiler-construction delegates type-conversion

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

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)编译得很好?

1 个答案:

答案 0 :(得分:3)

来自规范:

15.1委托声明

  

C#中的委托类型是名称等价的,在结构上不等同。   具体来说,两个不同的委托类型具有相同的   参数列表和返回类型被视为不同的委托   类型

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

7.6.10.5委托创建表达式

  

delegate-creation-expression用于创建a的新实例   委托型。委托创建表达式:

     

新委托类型(表达式)

     

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

     

•如果E是一个值,E必须与D兼容(第15.1节)和结果   是对新创建的D类委托的引用   与E相同的调用列表。如果E与D不兼容,则a   发生编译时错误。