为什么默认值不适用于双括号?

时间:2014-02-07 08:20:43

标签: c#

为什么要编译:

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

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

3 个答案:

答案 0 :(得分:9)

嗯,这不是指定语言的方式。

重要的是要理解default就像typeof - 它们是运算符 1 ,而不是方法调用。它不是类型的名称是一个参数 - 它是一个操作数,操作数应该只是类型名称。

C#5规范的第7.6.13节显示了默认值表达式的构造:

  

默认值表达式:
    default ( 类型 )

其中type只是类型或类型参数的名称。在使用泛型参数或声明变量时,您不能再将圆括号放在此处:

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

1 它从未在规范中指定为“默认运算符”;总是“默认值表达式” - 但它确实 是一个有意义的运算符,并且它与优先表中的其他运算符一起列出。

答案 1 :(得分:7)

这是因为(AnyType)(或者在你的情况下是(T))应该是强制转换,因此解析器会对此感到困惑并抛出错误。

答案 2 :(得分:0)

  

为什么要编译:

return default(T);

因为这在语法上是正确的。

  

但这不是:

return default((T));

因为这在语法上不正确。