2014-02-07 27 views
3

为什么这个编译:为什么默认不使用双括号?

return default(T); 

但这并不:

return default((T)); 

完整的方法是

public static T PenultimateOrDefault<T>(this IEnumerable<T> items) 
{ 
    if (items.Count() >= 2) 
     return items.ElementAt(items.Count() - 2); 
    else 
     return default(T); 
} 

default((T))的错误是

; expected 
Invalid expression term ')' 
Type expected 

所以看起来解析器被双括号所困扰。

+4

为什么要添加不必要的括号?曾听说过铸造? – Rob

+0

没理由。我添加了它,看它是否会起作用。这很有趣,为什么没有。 – Pol

回答

9

那么,这不是如何指定的语言。

重要的是要明白default就像typeof - 他们是运营商,而不是方法调用。这不是类型名称是一个参数 - 它是一个操作数,操作数应该只是类型名称。

科C#5规范的7.6.13示出了默认值表达式的结构:

默认值表达:
default (类型)

其中type只是类型或类型参数的名称。你可以使用时,一般的说法,或者声明一个变量,你可以不再把括号轮在这里:

(string) x = ""; // Invalid 
var x = new List<(string)>(); // Invalid 

这是从来没有指定为规范“的缺省操作”;总是“默认值表达式” - 但它确实是是具有所有有意义的意义的运算符,并且它与优先级表中的其他运算符一起列出。

7

这是因为(AnyType)(或在您的情况下(T))预计将是一个强制转换,所以分析器会对此产生困惑并引发错误。

+0

这不可能。 ''default('不能跟随一个表达式,并且解析器在非表达式中检查转换时会做什么? – hvd

+0

@ hvd它可能会将其视为与'object'方法相同。 –

+0

您可以详细说明吗?评论对我没有意义;我可能错过了你的观点 – hvd

0

为什么这个编译:

return default(T); 

因为这是语法正确。因为这不是语法正确

return default((T)); 

但这并不。