关于c#:在比较对象类型时typeof和有什么区别?

What is the difference between typeof and is when comparing object types?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Type Checking: typeof, GetType, or is?

所以我比较了一个控件的类型,我想我可以这样做。

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

但是,我得到了以下警告。

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

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

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

在比较控件类型时,该警告的确切含义以及typeof和is之间的区别是什么?


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

1
if(control[0] is TSendForReview)

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

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

为什么要发出警告?

The is keyword causes a compile-time warning if the expression is
known to always be true or to always be false, but typically evaluates
type compatibility at run time.

资料来源:MSDN


对于实现给定类型的所有对象,is运算符将返回true。getType函数返回对象的类型实例。因此,根据您的场景,将决定您希望如何执行类型检查。

采用以下代码

1
2
3
public interface IFoo { }
public class Foo : IFoo { }
public class FooDerived : Foo { }

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

1
obj.GetType() == typeof(IFoo)

如果检查结果如下,那么FOO和FOORDEVIED都是正确的,而其他一切都是错误的。

1
obj is IFoo

如果要确保某个对象是特定类型,而不是任何实现该类型的对象,则要执行以下检查,这对于foo是正确的,但对于fooderived不是。

1
obj.GetType() == typeof(Foo)