【发布时间】:2011-01-05 21:40:50
【问题描述】:
我问的原因是,它只在方法参数声明中有效,不是吗?我试图在函数体内创建一个名为“params”的变量,但这当然不是什么大问题,只是想知道 MS 选择将其设为全局关键字而不是上下文的原因。
【问题讨论】:
-
不确定为什么部分,但如果你真的想在 c# 中将其用作变量名,请在变量名前加上 @: int @params = 1;
标签: c# .net compiler-construction
我问的原因是,它只在方法参数声明中有效,不是吗?我试图在函数体内创建一个名为“params”的变量,但这当然不是什么大问题,只是想知道 MS 选择将其设为全局关键字而不是上下文的原因。
【问题讨论】:
标签: c# .net compiler-construction
同样可以询问任何其他关键字。例如,为什么“类”不是上下文相关的,因为它只在类声明中使用?
对我来说,关键字就是关键字。我想它极大地简化了编译的词法分析部分,不必了解上下文。
顺便说一句,您可以使用@ 符号来声明一个名为“params”(或任何其他保留关键字)的变量:
var @params = new int[] { 1, 2 };
【讨论】:
tvanoffson 的回答推测很难将“参数”与上下文相关联。其实不会那么难。考虑:
void M(params x)
在这种情况下,假设我们首先尝试查找类型“params”。如果我们能找到一个,太好了,我们完成了。如果我们不能,那么我们就有一点问题。假设例如,而不是 x 它是
void M(params Int32)
显然这是一个错误,但什么错误?我们是否应该假设 Int32 是参数名称并给出错误“您缺少类型”?我们是否应该假设 Int32 是类型并给出错误说该类型必须是数组类型,并且您缺少标识符?我们应该给出一个错误,说没有名为“params”的类型吗?在这里做什么是正确的?显然我们可以弄清楚一些事情,但并不明显。
使用上下文关键字棘手的是错误情况;让成功案例发挥作用实际上非常简单。
但实际上,很难 使上下文相关,因为使其具有上下文并不是一个真正的大胜利。使“set”和“value”上下文相关是一个巨大的胜利,因为我们假设各种各样的人都会想要使用“set”和“value”这样的名称来创建局部变量。 “params”甚至不是一个英文单词,所以似乎不太可能有人想要使用它。使其与上下文相关并没有太大的好处,因此该功能的成本是不合理的。
【讨论】:
Eric Lippert 的博客文章涵盖了 contextual and reserved keywords 及其历史。虽然它没有明确解释为什么 params 出现在保留列表中(从 1.0 开始就存在),但它暗示它属于保留字集,很难与上下文相关。 p>
【讨论】:
params 关键字看起来确实只在方法参数声明中有用,但我实际上同意 MS 的观点,无论如何让关键字用于实例名称并不是一个好主意。
也许他们保留了在 C# 8.0 中拥有类似功能的能力:
params Customers = DB.GetCustomerList();
或者在本地范围内也允许params。
【讨论】: