Checks if an object is compatible with a given type, i.e. if an object is an instance of the BaseInterface
type, or a type that derives from BaseInterface
:
interface BaseInterface {}
class BaseClass : BaseInterface {}
class DerivedClass : BaseClass {}
var d = new DerivedClass();
Console.WriteLine(d is DerivedClass); // True
Console.WriteLine(d is BaseClass); // True
Console.WriteLine(d is BaseInterface); // True
Console.WriteLine(d is object); // True
Console.WriteLine(d is string); // False
var b = new BaseClass();
Console.WriteLine(b is DerivedClass); // False
Console.WriteLine(b is BaseClass); // True
Console.WriteLine(b is BaseInterface); // True
Console.WriteLine(b is object); // True
Console.WriteLine(b is string); // False
If the intent of the cast is to use the object, it is best practice to use the [as](<http://stackoverflow.com/documentation/c%23/26/keywords/138/as>)
keyword’
interface BaseInterface {}
class BaseClass : BaseInterface {}
class DerivedClass : BaseClass {}
var d = new DerivedClass();
Console.WriteLine(d is DerivedClass); // True - valid use of 'is'
Console.WriteLine(d is BaseClass); // True - valid use of 'is'
if(d is BaseClass){
var castedD = (BaseClass)d;
castedD.Method(); // valid, but not best practice
}
var asD = d as BaseClass;
if (asD!=null) {
asD.Method(); //prefered method since you incur only one unboxing penalty
}
But, from C# 7 [pattern matching](<https://stackoverflow.com/documentation/c%23/1936/c-sharp-7-0-features/13323/pattern-matching#t=201707130940065371224>)
feature extends the is operator to check for a type and declare a new variable at the same time. Same code part with C# 7 :
if (d is BaseClass asD ){
asD.Method();
}