我稍微查了一下,但没有找到关于新的C# 6.0编译器如何分解新的空值传播命令的答案,例如以下内容:
BaseType myObj = new DerivedType();
string myString = (myObj as DerivedType)?.DerivedSpecificProperty;
我想知道的是它如何处理这个问题。
它是否将
as
转换为新的DerivedType
变量进行缓存(即,这只是as
转换后紧接着一个null比较的语法糖),还是实际执行as
转换,检查是否为空,然后如果不为空,重新转换并继续执行。
object
。这就是为什么转换是dup
的原因。在 IL 中,引用从一开始就不是BaseType
引用。 - phoogisinst
实现,它将对象从堆栈顶部弹出,然后根据参数是否可以分配给给定类型将对象或null重新推回堆栈。(堆栈上的引用仅具有一个类型:O
。) - phoog