2011-06-06 52 views
9

是否is操作指示对象是否是某一类的一个实例,或者只在可以铸造的那类?C#“是”经营者澄清

假设我有一个名为commandDbCommand,它实际上已被初始化为SqlCommandcommand is OracleCommand的结果是什么?

SqlCommandOracleCommand无论从DbCommand继承)

+0

结果不会是错误的,因为DbCommand和SqlCommand都不是OracleCommand的实例吗? – 2011-06-06 14:23:24

+0

'is'指示对象是否是该类型的实例或派生自此类型的实例。 http://msdn.microsoft.com/en-us/library/scekt9xw(v=VS.100).aspx – Jon 2011-06-06 14:24:34

+0

@they:这两个定义不一样吗? – Mehrdad 2011-06-06 14:24:45

回答

18

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

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

如果您有三个级别的继承,例如BaseClass,​​和SubSubClass,初始化为new SubClass()的对象仅对is BaseClassis SubClass返回true。尽管SubSubClass源自这两者,但该对象本身不是它的一个实例,因此is SubSubClass将返回false。

1

is指示该对象可以被浇铸到一个类或接口。

如果你有一个BaseClass的,然后一个子类:

var obj = new SubClass(); 

obj is SubClass返回true;

obj is BaseClass也返回true;

+1

如果你想比较实际的类型,使用'command.GetType()。Equals(typeof(SqlCommand))''。 – Jess 2011-06-06 14:22:58

+0

那些不相关的类型与显式的转换操作符在它们之间进行转换呢? – 2011-06-06 14:25:31

6

is一个表达式评估为真,如果所提供的表达为非空,并且所提供的对象可投到所提供的类型而不会导致抛出异常。

Source

4

MSDN:如果

的是表达式的值为true [...] 表达可以转换为键入

0

如果(某物是X)检查的基础类型的东西X。这与检查类型是否支持铸造到X有显着不同,因为许多类型可以支持铸造到X而不是类型X

相反地,作为操作者试图转换到特定类型并且指派如果源类型不是目标类型的继承链内。