110,534
社区成员
发帖
与我相关
我的任务
分享
test<int, char>();
来调用,那么c#编译器检查不出来这种垃圾代码,这种代码只有在运行时才会悲催地崩溃在用户面前,这就是动态语言的缺点。
而优点,自然就是省得你 copy 代码n次然后逐一修改里边的 type(....) 那各部分了。是 .net 在程序运行时动态产生的源代码然后使用 JIT 编译的,而不需要你在自己的源代码中重复书写多个类型。void test<A, B>()
{
var a = Convert.ChangeType(DateTime.Now.Ticks / 90000000000.0, typeof(A));
var b = Convert.ChangeType(DateTime.Now.Ticks / 90000000000.0, typeof(B));
Console.WriteLine($"a={a}, b={b}, equals={a.Equals(b)}");
}
这里在运行时就会根据范型模板中给每一个参数的不同而动态产生不同代码。
而这个方法根本没有参数,此时如果说什么“传递泛型方法参数”也就根本没有意义!List<int>
跟 List<double>
在运行时就会自动产生两个无关的类型,使用同一套 List<T> 模板而分分裂产生两个无关的类型定义代码,然后将这两个类型的源代码应用到目标程序上。
所以泛型声明需要几个,完全看代码模板的内部。而不是看参数有几个!static void test1<A, B, C>()
{
Console.WriteLine(typeof(B).FullName);
var x = default(A);
Console.WriteLine(x.GetType().FullName);
}
这里连 C 都没有用到,但是我们知道我们其实使用这里的 C 的意思是让 JIT 动态编写产生无数新的 class 代码,知道这个就理解了泛型了。