比较对象类型时 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 有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
使用 GetType() 和 typeof() 获取 Type 有啥区别? [复制]
typeof 和 instanceof 有啥区别,啥时候应该使用另一个?