所以我正在比较一个Control的类型,我想我可以做这样的事情。
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和之间的区别是什么。
答案 0 :(得分:8)
GetType
返回System.Type
的实例,这绝不是TSendForReview
的实例。你可能想用
if(control[0] is TSendForReview)
查看控件是否是您的类型的实例。
您的修改版本获取控件的运行时类型,并将其与TSendForReview
的类型实例进行比较。这与使用is不同,因为它必须具有确切的类型,而is
将为TSendForReview
的子类型返回true。
为什么警告?
如果表达式是,则is关键字会导致编译时警告 已知永远是真的或永远是假的,但通常是评估 运行时类型兼容性。
来源:MSDN
答案 1 :(得分:0)
对于实现给定类型的所有对象,IS运算符将返回true。 GetType函数返回对象的类型实例。因此,根据您的方案,将确定您希望如何执行类型检查。
采取以下代码
public interface IFoo { }
public class Foo : IFoo { }
public class FooDerived : Foo { }
然后,以下检查将始终为false,因为IFoo是一个接口(同样适用于抽象类),因为没有具体的实现。这可能是编译器大吼大叫的。
obj.GetType() == typeof(IFoo)
如果检查如下,则对Foo和FooDerived都是如此,对其他一切都是假的。
obj is IFoo
如果你想确保一个对象是一个特定的类型,而不是任何实现该类型的对象,你想要执行如下所述的检查,这对于Foo而言是正确的,但对于FooDerived则不然。
obj.GetType() == typeof(Foo)