为何示例中testB未触发CS0184警告,而testA触发该警告?
为什么
b is MyClass2不会触发CS0184警告? 先看对应的代码场景:
class Program { void Main() { var a = new MyClass1(); var b = (IMyInterface)new MyClass1(); // 触发CS0184警告 var testA = a is MyClass2; // 无警告 var testB = b is MyClass2; } } interface IMyInterface { } class MyClass1 : IMyInterface { } class MyClass2 { }
核心原因:
- 变量
a的编译时类型是具体类MyClass1,编译器能明确判断:MyClass1和MyClass2之间没有继承或实现关系,不存在任何可能让a的实际类型是MyClass2的情况,所以a is MyClass2的结果必然是false,直接抛出CS0184警告。 - 变量
b的编译时类型是接口IMyInterface,编译器无法在编译期穷尽所有实现该接口的类型。理论上存在其他类(比如后续新增的class MyClass3 : MyClass2, IMyInterface),这类实例既实现IMyInterface,同时又是MyClass2的子类或本身。编译器不能排除运行时b指向这类对象的可能性,因此不会触发警告。
内容的提问来源于stack exchange,提问作者innominate227
相关产品推荐
相关产品推荐

