typeof和在比较对象类型时有什么区别?

时间:2012-07-19 20:45:32

标签: c# types controls

  

可能重复:
  Type Checking: typeof, GetType, or is?

所以我正在比较一个Control的类型,我想我可以做这样的事情。

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和之间的区别是什么。

2 个答案:

答案 0 :(得分:8)

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

if(control[0] is TSendForReview)

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

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

为什么警告?

  

如果表达式是,则is关键字会导致编译时警告   已知永远是真的或永远是假的,但通常是评估   运行时类型兼容性。

来源:MSDN

答案 1 :(得分:0)

对于实现给定类型的所有对象,IS运算符将返回true。 GetType函数返回对象的类型实例。因此,根据您的方案,将确定您希望如何执行类型检查。

采取以下代码

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

然后,以下检查将始终为false,因为IFoo是一个接口(同样适用于抽象类),因为没有具体的实现。这可能是编译器大吼大叫的。

obj.GetType() == typeof(IFoo)

如果检查如下,则对Foo和FooDerived都是如此,对其他一切都是假的。

obj is IFoo

如果你想确保一个对象是一个特定的类型,而不是任何实现该类型的对象,你想要执行如下所述的检查,这对于Foo而言是正确的,但对于FooDerived则不然。

obj.GetType() == typeof(Foo)