typeof(T)与new T().GetType()是否始终相等?
问题
在带有约束where T : new()的泛型方法Foo<T>中,表达式typeof(T) == new T().GetType()是否始终为true?
我认为它不可能为false,但或许遗漏了某些边缘情况。
相关问题未涉及该疑问:
- Type Checking: typeof, GetType, or is?
- When and where to use GetType() or typeof()?
- What is the difference of getting Type by using GetType() and typeof()?
回答
在满足where T : new()约束的前提下,这个表达式必然始终为true,不存在会导致结果为false的边缘情况,原因如下:
new()约束要求T必须是非抽象类型,且拥有可访问的无参构造函数,直接排除了抽象类、接口这类无法直接实例化的类型。new T()会直接创建T类型的实例:C#中构造函数仅负责初始化当前类型的实例,无法返回派生类或其他类型的对象,因此实例的实际运行时类型就是T。typeof(T)返回泛型参数T对应的编译时类型,GetType()返回对象的实际运行时类型,两者指向同一个Type实例,因此比较结果恒为true。
无论T是值类型、密封类还是带有自定义无参构造函数的类型,只要符合new()约束,new T()创建的实例类型都严格等于T,表达式结果不会改变。
内容的提问来源于stack exchange,提问作者Brondahl
相关产品推荐
相关产品推荐

