从冗余演员表得到优化吗?我可以看到编译器没有优化不必要的向下转换(即castclass
)。但现在我对一个更简单的情况感兴趣,“如果编译器优化了不必要的向上转换?” 这个问题只涉及引用类型,而不涉及boxing
.
在我看来,这upcast
不会产生任何 IL,因此冗余显式upcast
根本不需要成本?upcast
还是因为 IL 指令是无类型的,所以在幕后仍然存在冗余显式的性能成本?
或者有时会向上转换产生任何 IL 指令?
class Foo
{
}
class Bar : Foo
{
}
bool Test(object x)
{
return x == null;
}
void Main()
{
var x = new Bar();
Console.Write(Test((Foo)x)); // redundant explicit to Foo, and then implicit to Object
var y = new Bar(); // implicit to Object
Console.Write(Test(y));
}
IL_0000: newobj UserQuery+Bar..ctor
IL_0005: stloc.0 // x
IL_0006: ldarg.0
IL_0007: ldloc.0 // x
IL_0008: call UserQuery.Test
IL_000D: call System.Console.Write
IL_0012: newobj UserQuery+Bar..ctor
IL_0017: stloc.1 // y
IL_0018: ldarg.0
IL_0019: ldloc.1 // y
IL_001A: call UserQuery.Test
IL_001F: call System.Console.Write