[英]C# 'is' operator Clarification
is
运算符是否指示 object 是否是某个 class 的实例,或者仅当它可以转换为该 class 时?
假设我有一个名为command
的DbCommand
实际上已被初始化为SqlCommand
。 command is OracleCommand
?
( SqlCommand
和OracleCommand
都继承自DbCommand
)
它检查 object 是否是该类型的成员,或者是从基类型或接口继承或实现的类型。 在某种程度上,它确实检查了 object 是否可以转换为所述类型。
command is OracleCommand
返回 false 因为它是SqlCommand
,而不是OracleCommand
。 但是,两个command is SqlCommand
并且command is DbCommand
将返回 true,因为它是这两种类型的成员,因此可以分别向下转换或向上转换。
如果您有 inheritance 的三个级别,例如BaseClass
、 SubClass
和SubSubClass
,则初始化为new SubClass()
的 object 仅对is BaseClass
和is SubClass
返回 true 。 尽管SubSubClass
派生自这两者,但 object 本身并不是它的实例,因此is SubSubClass
返回 false。
如果提供的表达式不为空,则
is
表达式的计算结果为 true,并且可以将提供的 object 强制转换为提供的类型,而不会引发异常。
来自MSDN :
如果 [...]表达式可以转换为类型,则 is 表达式的计算结果为 true
http://msdn.microsoft.com/en-us/library/scekt9xw%28v=vs.80%29.aspx
如果提供的表达式不为空,则 is 表达式的计算结果为 true,并且可以将提供的 object 强制转换为提供的类型,而不会引发异常。
指示 object is
可以转换为 class 或接口。
如果你有一个 BaseClass 和一个 SubClass 然后:
var obj = new SubClass();
obj is SubClass
返回 true;
obj is BaseClass
也返回 true;
if(something is X)检查某事物的基础类型是否为X 。 这与检查一个类型是否支持转换为X明显不同,因为许多类型可以支持转换为X而不是X类型。
相反,如果源类型不在目标类型的 inheritance 链中,则as运算符尝试转换为特定类型并分配null 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.