is
运算符是否指示对象是某个类的实例,还是仅当可以将表示到该类时?
假设我有一个名为DbCommand
的{{1}}实际上已初始化为command
。 SqlCommand
的结果是什么?
(command is OracleCommand
和SqlCommand
都继承自OracleCommand
)
答案 0 :(得分:18)
它检查对象是否是该类型的成员,或者是继承自或实现基类型或接口的类型。在某种程度上,它会检查对象是否可以转换为所述类型。
command is OracleCommand
返回false,因为它是SqlCommand
,而不是OracleCommand
。但是,command is SqlCommand
和command is DbCommand
都将返回true,因为它是这两种类型的成员,因此可以分别向下或向上转发。
如果您有三个级别的继承,例如BaseClass
,SubClass
和SubSubClass
,初始化为new SubClass()
的对象仅对is BaseClass
和is SubClass
返回true。虽然SubSubClass
来自这两者,但对象本身不是它的实例,因此is SubSubClass
返回false。
答案 1 :(得分:6)
如果提供的表达式为非null,则
is
表达式的计算结果为true,并且提供的对象可以转换为提供的类型,而不会引发异常。
答案 2 :(得分:4)
来自MSDN:
如果[...] 表达式可以转换为类型
,则表达式的计算结果为true
答案 3 :(得分:3)
http://msdn.microsoft.com/en-us/library/scekt9xw%28v=vs.80%29.aspx
如果提供的表达式为非null,则is表达式的计算结果为true,并且提供的对象可以强制转换为,而不会引发异常。
答案 4 :(得分:1)
is
表示对象是否可以转换为类或接口。
如果您有BaseClass和SubClass,那么:
var obj = new SubClass();
obj is SubClass
返回true;
obj is BaseClass
也会返回true;
答案 5 :(得分:0)
如果(某事是X)检查某事的基础类型是否 X 。这与检查类型是否支持转换为 X 有很大不同,因为许多类型可以支持转换为 X 而不是类型 X 。
相反,如果源类型不在目标类型的继承链中, as 运算符会尝试转换为特定类型并指定 null 。