5

可能重复:
类型检查:typeof、GetType 或 is?

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

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

4

2 回答 2

8

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

if(control[0] is TSendForReview)

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

您修改后的版本获取控件的运行时类型并将其与TSendForReview. 这与使用 is 不同,因为它必须具有确切的类型,而is对于TSendForReview.

为什么要发出警告?

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

资料来源:MSDN

于 2012-07-19T20:47:17.427 回答
0

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

取下面的代码

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

那么下面的检查总是错误的,因为 IFoo 是一个接口(同样适用于抽象类),因为没有具体的实现。这可能是编译器大喊大叫的。

obj.GetType() == typeof(IFoo)

如果检查如下,则 Foo 和 FooDerived 都为 true,其他所有内容为 false。

obj is IFoo

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

obj.GetType() == typeof(Foo)
于 2012-07-19T21:06:01.460 回答