C#’是’运营商澄清
is
运算符是否指示对象是否是某个类的实例 ,或者只有它可以被转换为该类?
假设我有一个名为DbCommand
command
,它实际上已经被初始化为SqlCommand
。 command is OracleCommand
的结果command is OracleCommand
?
( SqlCommand
和OracleCommand
都从DbCommand
inheritance)
它检查对象是否是该类型的成员,或者是inheritance或实现基类型或接口的类型。 在某种程度上,它确实检查对象是否可以转换为所述类型。
command is OracleCommand
返回false,因为它是一个SqlCommand
,而不是OracleCommand
。 但是,两个command is SqlCommand
, command is DbCommand
将返回true,因为它是这两种类型的成员,因此可以分别向下或向上转发。
如果你有三个级别的inheritance,例如BaseClass
, SubClass
和SubSubClass
,初始化为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 。