泛型方法如何在C#中实例化?

泛型方法如何在C#中实例化?,c#,generics,generic-method,C#,Generics,Generic Method,假设我有一个通用方法,如下所示: void Fun<T>(FunArg arg) {} void-Fun(FunArg-arg){ this.Fun和this.Fun是泛型方法的不同实例化吗 一般来说,泛型方法是如何实例化的?不同的泛型参数会产生不同的方法,或者在运行时使用相同的方法和不同的元数据 请用语言规范中的一些引用来支持您的答案 另外,假设我做了这些: client.SomeEvent += this.Fun<Feature>; //line1 clien

假设我有一个通用方法,如下所示:

void Fun<T>(FunArg arg) {}
void-Fun(FunArg-arg){
this.Fun
this.Fun
是泛型方法的不同实例化吗

一般来说,泛型方法是如何实例化的?不同的泛型参数会产生不同的方法,或者在运行时使用相同的方法和不同的元数据

请用语言规范中的一些引用来支持您的答案

另外,假设我做了这些:

client.SomeEvent += this.Fun<Feature>;   //line1
client.SomeEvent += this.Fun<Category>;  //line2
client.SomeEvent += this.Fun<Result>;    //line3
client.SomeEvent+=this.Fun//第1行
client.SomeEvent+=this.Fun//第2行
client.SomeEvent+=this.Fun//第3行
后来呢,

client.SomeEvent -= this.Fun<Feature>;   //lineX
client.SomeEvent-=this.Fun//lineX

lineX
是否撤消了我在
line1
中所做的操作?或者它也取决于其他东西?

是的,它们将成为两种不同的方法。

这取决于所涉及的类型

对于所有引用类型(即类),将对一个方法进行JIT以处理所有引用类型

对于所有的值类型(即结构),每个类型将有一个方法被JITted

因此,问题中的信息不够详细,无法回答,如果
功能
类别
是参考类型,那么是的,将为它们使用一种方法。如果其中一个或两个都是值类型,则每个值类型将有一个方法被JIT

注意我在这里使用的JITted这个词。在编译的程序集中,只有一个方法,但在运行时,抖动将根据上述规则创建泛型方法的实际实现

突击测验:如果对具有泛型类型/方法的程序集使用
NGEN
,会发生什么情况?(提示:)

它们都共享一个方法定义,但在运行时它们是不同的
MethodInfo
——因为泛型类型参数定义了一个泛型方法

支持性说明:

    Action<FunArg> a1 = Fun<X>;
    Action<FunArg> a2 = Fun<Y>;
    Action<FunArg> a3 = Fun<Y>;
    Console.WriteLine(a1.Method == a2.Method); // false
    Console.WriteLine(a3.Method == a2.Method); // true
Action a1=乐趣;
行动a2=乐趣;
行动a3=乐趣;
Console.WriteLine(a1.Method==a2.Method);//假的
Console.WriteLine(a3.Method==a2.Method);//真的

在JIT级别,它更复杂;任何引用类型参数都将共享一个实现,因为引用就是引用就是引用(请注意,所有此类
T
必须提前满足任何约束)。如果存在值类型
T
,则泛型类型参数的每个组合在运行时都会得到一个单独的实现,因为每个组合都需要一个不同的最终实现。

您对此有任何来源吗?顺便说一下,我可能必须删除此答案,因为我没有仔细研究这个问题。这不是有效的代码。不能将方法组转换用作
var
声明的目标。提供有效的代码,我们就可以给出更好的答案。@JonSkeet:删除了那个部分。那么现在,你所说的“实例化”到底是什么意思?你的问题越清楚,你的答案就越清楚。@JonSkeet:我说的实例化是指运行时的不同方法。泛型方法的两个实例化意味着在运行时两个不同且独立的方法不共享任何内容。@Nawaz“在运行时两个不同的方法不共享任何内容”很棘手。。。。每个
T
都是一个独立的
MethodInfo
,但仍然可能存在一些“共享”(即JIT共享),它们肯定共享相同的通用声明。这在IL级别不简单,但在本机(JIT编译)级别复杂吗?我用更多的查询更新了我的问题。同样请注意:-)@Nawaz通过评论回答