C#’是’运营商澄清

is运算符是否指示对象是否某个类的实例 ,或者只有它可以被转换为该类?

假设我有一个名为DbCommand command ,它实际上已经被初始化为SqlCommandcommand is OracleCommand的结果command is OracleCommand

SqlCommandOracleCommand都从DbCommandinheritance)

它检查对象是否是该类型的成员,或者是inheritance或实现基类型或接口的类型。 在某种程度上,它确实检查对象是否可以转换为所述类型。

command is OracleCommand返回false,因为它是一个SqlCommand ,而不是OracleCommand 。 但是,两个command is SqlCommandcommand is DbCommand将返回true,因为它是这两种类型的成员,因此可以分别向下或向上转发。

如果你有三个级别的inheritance,例如BaseClassSubClassSubSubClass ,初始化为new SubClass()的对象只返回true为is BaseClass并且is SubClass 。 虽然SubSubClass派生自这两者,但是对象本身不是它的实例,因此is SubSubClass返回false。

如果提供的表达式为非null,则is表达式求值为true,并且可以将提供的对象强制转换为提供的类型,而不会引发exception。

资源

来自MSDN :

如果[…] 表达式可以转换为类型,则表达式的计算结果为true

http://msdn.microsoft.com/en-us/library/scekt9xw%28v=vs.80%29.aspx

如果提供的表达式为非null,则is表达式求值为true,并且可以将提供的对象强制转换为提供的类型,而不会引发exception。

指示对象是否可以转换为类或接口。

如果您有BaseClass和SubClass,那么:

 var obj = new SubClass(); 

obj is SubClass返回true;

obj is BaseClass也返回true;

如果(某事是X)检查某事物的基础类型是否为X. 这与检查类型是否支持转换为X有很大不同,因为许多类型可以支持转换为X而不是类型X.

相反, as运算符尝试转换为特定类型,如果源类型不在目标类型的inheritance链中,则赋值为null