2011-02-15 145 views
1

我有一个通用方法,我需要比较泛型与另一种类型。比较类型

下面的代码总是抛出异常:

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(); } 
} 

提示。

+1

似乎是一个不好的设计时,你必须检查你输入的类型,开始与通用方法。为什么不使用约束? – 2011-02-15 22:41:46

回答

2

Type的类型是名为Type的类,而不是它指向的类。 (希望是有道理的!)所以你真的要检查代表TypeType对象是否等于其他一些Type对象,显然不是。

换句话说,说

_vertexType.DataType is T 

好像是说

typeof(T).IsAssignableFrom(_vertexType.DataType.GetType()) 

,但它显然不是一般真实的,因为Type调用对象的GetType()给你代表TypeType对象。

0

_vertexType.DataType将只会是TT类型Type,根据您的财产声明。

1

使用typeof(myType)而不是default(myType).GetType()。此外,您的DataType已经返回一个类型,所以你应该使用比较:

if(_vertexType.DataType != typeof(T)) 
    throw new Exception(); 

DataType属性已返回的Type一个实例,因此唯一的一次_vertexType.DataType is T将是真实的是,当TType

0

此代码:

_vertexType.DataType != default(T).GetType() 

将永远是System.NullReferenceException如果T扔是引用类型。它将适用于值类型和结构,因为它们不能为null,并且具有默认值,它们提供了一个实例来调用GetType()

这里的default关键字基本上是语法糖(供null引用类型和值类型的默认值),并转换成的

initobj !!T 

的IL操作码,而根据文档初始化值键入带有空引用和基元类型的默认值。这似乎也包括泛型引用类型。

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