为什么要编译:
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
因此看起来解析器被双括号所困扰。
答案 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));
因为这在语法上不正确。