2016-01-04 63 views
6

我四处张望了一下,但一直没能找到一个答案,新的C#6.0编译如何分解为一些新的空传播命令,如下所示:空传播运营商

BaseType myObj = new DerivedType(); 
string myString = (myObj as DerivedType)?.DerivedSpecificProperty; 

我想知道的是它如何处理这个问题。

它是否会将as演员组缓存到新的DerivedType变量中(即,这只是as演员后面跟着空比较的语法糖)。

或者如果它实际上as强制转换,请检查null,然后如果不是null,重铸并继续。

回答

8

是否缓存as浇铸成一个新的变量DerivedType(即,这是用于as铸造之后是空的比较只是语法糖)。

是。

您的代码将被编译成这样的:

BaseType myObj = new DerivedType(); 
DerivedType temp = myObj as DerivedType; 
string myString = temp != null ? temp.DerivedSpecificProperty : null; 

你可以看到,this TryRoslyn example(虽然,因为HVD评论说,通过观察IL你可以看到有实际上不是DerivedType变量这个引用只是简单的存储在堆栈中)。

+0

那么,没有。如果关闭C#反编译模式并只检查IL生成的内容,就会发现它不使用变量,它只是使用'dup'来复制堆栈中的值。 – hvd

+0

@ hvd这是因为IL中唯一内置的引用类型是对象和字符串。 – phoog

+0

@phoog我完全不知道你说的是什么意思。 – hvd