我有一个Generic方法,我需要将泛型类型与另一种类型进行比较。
以下代码始终抛出异常:
if (!(_vertexType.DataType is T))
throw new Exception();
但这不是:
if(_vertexType.DataType != default(T).GetType())
throw new Exception();
这是为什么? 是运算符有什么我不明白的吗?
如果有帮助,_vertexType.DataType函数如下所示:
Type DataType
{
get { return default(myType).GetType(); }
}
如何正确地做到这一点的提示也会很棒。
答案 0 :(得分:2)
Type
的类型是名为Type
的类,而不是它指向的类。 (希望这很有意义!)所以你真的要检查代表Type
的{{1}}对象是否等于其他Type
对象,显然不是。
换句话说,说
Type
就像说
_vertexType.DataType is T
但显然通常不是这样,因为在typeof(T).IsAssignableFrom(_vertexType.DataType.GetType())
对象上调用GetType()
会为您提供一个代表Type
类的Type
对象。
答案 1 :(得分:1)
使用typeof(myType)
代替default(myType).GetType()
。此外,您的DataType
已经返回了一个类型,因此您应该使用比较:
if(_vertexType.DataType != typeof(T))
throw new Exception();
DataType
属性已经返回Type
的实例,因此唯一的_vertexType.DataType is T
时间是T
Type
。
答案 2 :(得分:0)
_vertexType.DataType
类型为T
时, T
将Type
为{{1}}。
答案 3 :(得分:0)
此代码:
_vertexType.DataType != default(T).GetType()
如果System.NullReferenceException
是引用类型,将始终抛出T
。它适用于值类型和结构,因为它们不能为null并且具有默认值,这些默认值提供了一个实例来调用GetType()
。
这里的default
关键字基本上是语法糖(参考类型为null
,值类型为默认值),并转换为IL /或
initobj !!T
,根据文档,使用空引用和基本类型的默认值初始化值类型。这似乎也包括通用引用类型。