C# 在比较对象类型时,typeof和is之间有什么区别?
可能重复:C# 在比较对象类型时,typeof和is之间有什么区别?,c#,types,controls,C#,Types,Controls,可能重复: 所以我比较了一个控件的类型,我想我可以这样做 if (control[0].GetType() is TSendForReview) 然而,我得到以下警告 The given expression is never of the provided ('MyApp.Controls.TSendForReview') type 所以如果我换成这个,警告就会消失 if (control[0].GetType() == typeof(TSendForReview)) 在比较控
所以我比较了一个控件的类型,我想我可以这样做
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之间的区别是什么
GetType
返回System.Type
的实例,而这绝不是TSendForReview
的实例。您可能想使用
if(control[0] is TSendForReview)
查看控件是否是您的类型的实例
修改后的版本获取控件的运行时类型,并将其与TSendForReview
的类型实例进行比较。这与使用is不同,因为它必须具有确切的类型,而对于TSendForReview
的子类型,is
将返回true
为什么要发出警告
如果表达式为,is关键字将导致编译时警告
已知总是正确的或总是错误的,但通常评估
在运行时输入兼容性
来源:对于实现给定类型的所有对象,IS运算符将返回true。GetType函数返回对象的类型实例。因此,根据您的场景,您将决定如何执行类型检查 以下面的代码为例
public interface IFoo { }
public class Foo : IFoo { }
public class FooDerived : Foo { }
然后以下检查将始终为false,因为IFoo是一个接口(同样适用于抽象类),因为没有具体的实现。这可能是编译器正在大喊的
obj.GetType() == typeof(IFoo)
如果检查如下所示,则Foo和FooDerived都为true,其他所有检查都为false
obj is IFoo
如果要确保某个对象是特定类型的,而不是任何实现该类型的对象,则需要执行如下检查,这对于Foo是正确的,但对于fooded则不是
obj.GetType() == typeof(Foo)
可能的副本或我看到我看到。我真的需要学习使用MSDN。谢谢你的解释!