“is”运算符所做的操作,不仅仅检查数据能否从一个类型转换成另一个类型。一个类型内部可能实现类向某一类型的强制转换,然而“is”运算符不仅仅检查类型成功,还会检查底层对象本身是否真的是一个要转换的类型或者兼容类型。
下面通过一个小例子来说明下问题。
object o = new object ();
Console. WriteLine (o is string );
o = "o contains string value ";
Console. WriteLine ( o is string );
o = 123;
Console. WriteLine ( o is string );
输出的结果是:
false
true
false
为什么是这样的结果呢?
先说第一个输出,“o”初始化为一对象。Object实现了向string转换的方法ToString(),应该说是可以向string转换成功的。但是我们说“is”不仅仅检查是否能转换成功,还检查对象本省是否是目标类型或兼容类型。由于所有类型都是从object类派生出来的,所以所有类型是“属于”object类型的,而object不一定属于派生类型,需要强制转换。所以返回的结果是“false”。
第二个输出由于给“o”赋值是一个字符串,所以“o”存储的是string类型的值。所以返回“true”。
同样第三个输出也是由于“123”是数值类型的,不是string类型的,所以返回“false”。