2012-07-19 70 views
2

可能重复:
Type Checking: typeof, GetType, or is?typeof和当比较对象类型时有什么区别?

所以我比较控件的类型,我想我可以做这样的事情。

if (control[0].GetType() is TSendForReview) 

但是,我收到以下警告。

The given expression is never of the provided ('MyApp.Controls.TSendForReview') type  

所以,如果我切换到这个警告消失。

if (control[0].GetType() == typeof(TSendForReview)) 

这个警告究竟意味着什么,并且比较控件类型时typeof和它之间有什么区别。

+0

可能重复http://stackoverflow.com/questions/7765372/what-is-the-difference-between-typeof-and-the-is-keyword或[类型检查:typeof运算,的GetType,或是吗?](http://stackoverflow.com/questions/983030/type-checking-typeof-gettype-oris) – 2012-07-19 20:49:21

回答

8

GetType返回System.Type的实例,这绝不是TSendForReview的实例。您可能想要使用

if(control[0] is TSendForReview) 

查看控件是否是您的类型的实例。

修改后的版本获取控件的运行时类型,并将其与TSendForReview的类型实例进行比较。这与使用不一样,因为它必须具有确切的类型,而is将对TSendForReview的子类型返回true。

为什么警告?

的是关键字导致编译时间如果表达式是 已知总是为真或为始终是虚假警告,但通常评估在运行时 类型的兼容性。

来源:MSDN

+0

我明白了。我真的需要学习使用MSDN。谢谢你的解释! – meanbunny 2012-07-19 20:51:55

0

is运算符将用于实现给定类型的所有对象返回true。 GetType函数为对象返回一个类型实例。所以根据你的情况决定你想如何执行你的类型检查。

看看下面的代码

public interface IFoo { } 
public class Foo : IFoo { } 
public class FooDerived : Foo { } 

然后下面的检查将永远是假的IFoo的是一个接口(同样适用于抽象类),因为没有具体落实。这可能是编译器在大喊大叫。

obj.GetType() == typeof(IFoo) 

如果检查如下,对Foo和FooDerived都是如此,对于其他所有情况都是false。

obj is IFoo 

如果你想确保对象是特定类型的,并没有实现,你将要执行的检查类似下面,这将是Foo的真实的类型,但不是FooDerived任何对象。的

obj.GetType() == typeof(Foo) 
相关问题