将typeof(T) == typeof(string)
中的T作为泛型类型参数,将被编译为常量布尔值,因为条件在编译时是可知的吗?
答案 0 :(得分:4)
IL中存在通用类型数据 - 它不像Java那样被删除。所以:不, C#编译器不会将其编译为常量;它编译了IL,它讨论了泛型类型参数。
JIT 然后重用用于所有引用类型排列(只有每个值类型排列需要单独的JIT,因为大小/装箱/等原因)。由于string
是引用类型,这意味着Foo<string>
(其中typeof(T)==typeof(string)
为true
)使用与Foo<SomeClass>
相同的JIT输出(其中{{1}是typeof(T)==typeof(string)
)。所以不是:即使在JIT时间,这也是明确的不常量。
答案 1 :(得分:0)
我对此进行了一些性能测试,结果如下:
在VS2017和.net 4.6.2上使用C#测试,并启用了优化功能。