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。谢谢你的解释!