检查对象是否与给定类型兼容,即对象是该BaseInterface类型的实例还是从BaseInterface以下类型派生的类型:
interface BaseInterface {}
class BaseClass : BaseInterface {}
class DerivedClass : BaseClass {}
var d = new DerivedClass();
Console.WriteLine(d is DerivedClass); // 真正
Console.WriteLine(d is BaseClass); // 真正
Console.WriteLine(d is BaseInterface); // 真正
Console.WriteLine(d is object); // 真正
Console.WriteLine(d is string); // 假
var b = new BaseClass();
Console.WriteLine(b is DerivedClass); // 假
Console.WriteLine(b is BaseClass); // 真正
Console.WriteLine(b is BaseInterface); // 真正
Console.WriteLine(b is object); // 真正
Console.WriteLine(b is string); // 假如果强制转换的目的是使用对象,则最佳做法是使用as关键字'
interface BaseInterface {}
class BaseClass : BaseInterface {}
class DerivedClass : BaseClass {}
var d = new DerivedClass();
Console.WriteLine(d is DerivedClass); // 真正 - valid use of 'is'
Console.WriteLine(d is BaseClass); // 真正 - valid use of 'is'
if(d is BaseClass){
var castedD = (BaseClass)d;
castedD.Method(); // 有效,但不是最佳做法
}
var asD = d as BaseClass;
if(asD!=null){
asD.Method(); //首选方法,因为您只需承担一次拆箱罚款
}但是,从C#7pattern matching功能扩展了is运算符以检查类型并同时声明一个新变量。与C#7相同的代码部分:
if(d is BaseClass asD ){
asD.Method();
}