繁体   English   中英

C#'是'运营商澄清

[英]C# 'is' operator Clarification

is运算符是否指示 object 是否是某个 class 的实例,或者仅当它可以转换为该 class 时?

假设我有一个名为commandDbCommand实际上已被初始化为SqlCommand command is OracleCommand

SqlCommandOracleCommand都继承自DbCommand

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

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

如果您有 inheritance 的三个级别,例如BaseClassSubClassSubSubClass ,则初始化为new SubClass()的 object 仅对is BaseClassis 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM