作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设我有一个通用方法:
void Fun<T>(FunArg arg) {}
是this.Fun<Feature>
和 this.Fun<Category>
泛型方法的不同实例?
一般来说,泛型方法是如何被实例化的?不同的通用参数产生不同的方法,或者相同的方法连同在运行时使用的不同元数据?
请引用语言规范中的一些引文来支持您的回答。
另外,假设我做了这些:
client.SomeEvent += this.Fun<Feature>; //line1
client.SomeEvent += this.Fun<Category>; //line2
client.SomeEvent += this.Fun<Result>; //line3
然后,
client.SomeEvent -= this.Fun<Feature>; //lineX
lineX
撤消我在 line1
所做的事情?或者它还取决于其他因素?
最佳答案
它们都共享一个方法定义,但在运行时它们是不同的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
在JIT层面,比较复杂;任何引用类型的参数都将共享一个实现,因为引用就是引用就是引用(注意所有这样的T
必须事先满足任何约束)。如果存在值类型 T
,则泛型类型参数的每个组合在运行时都会获得单独的实现,因为每个组合都需要不同的最终实现。
关于c# - 如何在 C# 中实例化泛型方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10278994/
我是一名优秀的程序员,十分优秀!