C#'是'运营商澄清

时间:2011-06-06 14:19:55

标签: c#

is运算符是否指示对象是某个类的实例,还是仅当可以将表示到该类时?

假设我有一个名为DbCommand的{​​{1}}实际上已初始化为commandSqlCommand的结果是什么?

command is OracleCommandSqlCommand都继承自OracleCommand

6 个答案:

答案 0 :(得分:18)

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

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

如果您有三个级别的继承,例如BaseClassSubClassSubSubClass,初始化为new SubClass()的对象仅对is BaseClassis SubClass返回true。虽然SubSubClass来自这两者,但对象本身不是它的实例,因此is SubSubClass返回false。

答案 1 :(得分:6)

  

如果提供的表达式为非null,则is表达式的计算结果为true,并且提供的对象可以转换为提供的类型,而不会引发异常。

Source

答案 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