比较对象类型时 typeof 和 is 有啥区别? [复制]

Posted

技术标签:

【中文标题】比较对象类型时 typeof 和 is 有啥区别? [复制]【英文标题】:What is the difference between typeof and is when comparing object types? [duplicate]比较对象类型时 typeof 和 is 有什么区别? [复制] 【发布时间】:2012-07-19 02:53:15 【问题描述】:

可能重复:Type Checking: typeof, GetType, or 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 之间的区别是什么。

【问题讨论】:

***.com/questions/7765372/… 或 Type Checking: typeof, GetType, or is? 的可能重复项 【参考方案1】:

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

if(control[0] is TSendForReview)

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

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

为什么会出现警告?

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

来源:MSDN

【讨论】:

我明白了。我真的需要学习使用MSDN。谢谢你的解释!【参考方案2】:

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)

【讨论】:

以上是关于比较对象类型时 typeof 和 is 有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

AS3中 is,as,typeof的区别

使用 GetType() 和 typeof() 获取 Type 有啥区别? [复制]

typeof 和 instanceof 有啥区别,啥时候应该使用另一个?

根据你的理解,简要说明使用双等号(==)和equals()方法判断两个字符串是不是相等有啥区别

r语言中的class,mode和typeof的区别

基础篇Python中is和==的区别