inn*_*227 1 c# compiler-warnings roslyn
为什么本示例中的 testB不像 testA 那样给出“警告 CS0184:给定的表达式永远不是提供的 ('MyClass2') 类型”?
class Program
{
void Main()
{
var a = new MyClass1();
var b = (IMyInterface)new MyClass1();
//Get a CS0184 Warning on this line
var testA = a is MyClass2;
//No warning on this line
var testB = b is MyClass2;
}
}
interface IMyInterface
{
}
class MyClass1 : IMyInterface
{
}
class MyClass2
{
}
Run Code Online (Sandbox Code Playgroud)
因为 的类型b是IMyInterface. 编译器不会分析代码来查找您分配给的对象的实际运行时类型b。
类型变量可以IMyInterface是is MyClass2。例如, ifb引用以下实例MyClass3:
class MyClass3: MyClass2, IMyInterface {}
Run Code Online (Sandbox Code Playgroud)
当然,如果MyClass2是sealed,MyClass3则不能存在,因此在这种情况下b永远不会存在is MyClass2,并且您会按预期收到警告。
这也是为什么可以将非密封类类型的表达式强制转换为任何接口类型,例如
var a = new MyClass2();
// this compiles, but throws an exception at runtime, of course
var b = (IMyInterface)a;
Run Code Online (Sandbox Code Playgroud)
即使MyClass2没有实现IMyInterface,在运行时它也可能引用某个实现了IMyInterface的子类。
| 归档时间: |
|
| 查看次数: |
50 次 |
| 最近记录: |