【问题标题】: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 之间的区别是什么。

【问题讨论】:

标签: c# types controls


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 2016-07-25
    • 2014-02-24
    • 1970-01-01
    • 2014-06-29
    • 2012-01-22
    • 2011-01-14
    相关资源
    最近更新 更多