比较类型

时间:2011-02-15 22:36:58

标签: c# types

我有一个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(); }
}

如何正确地做到这一点的提示也会很棒。

4 个答案:

答案 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时,

TType为{{1}}。

答案 3 :(得分:0)

此代码:

_vertexType.DataType != default(T).GetType()
如果System.NullReferenceException是引用类型,

将始终抛出T。它适用于值类型和结构,因为它们不能为null并且具有默认值,这些默认值提供了一个实例来调用GetType()

这里的default关键字基本上是语法糖(参考类型为null,值类型为默认值),并转换为IL /或

的OpCode
initobj !!T

,根据文档,使用空引用和基本类型的默认值初始化值类型。这似乎也包括通用引用类型。

请参阅:http://msdn.microsoft.com/en-us/library/xwth0h0d.aspx