2011-01-05 43 views
6

我问的原因是,它只在方法参数声明中有效,不是吗?我试图在函数体内创建一个名为“params”的变量,但当然这不是什么大问题,只是想知道MS选择使其成为全局关键字而不是上下文的原因。为什么params关键字不是上下文的?

+3

不知道为什么部分,但如果你真的想在c#中使用这个作为变量名称前言变量名称@:int @params = 1; – Derrick 2011-01-05 21:44:16

回答

5

tvanoffson的答案推测,很难做出“参数”的上下文。它实际上不会那么难。考虑:

void M(params x) 

在这种情况下,假设我们要做的是首先尝试找到一个类型'params'。如果我们能找到一个,那就太棒了,我们完成了。如果我们不能,那么我们有一个问题。假设,而不是x它是

void M(params Int32) 

显然,这是一个错误,但什么错误?我们是否应该假设Int32是参数名称,并提供错误“您缺少类型”?我们是否应该假设Int32是类型,并给出错误,指出该类型必须是数组类型,并且缺少标识符?我们是否应该给出一个错误,说没有名为'params'的类型?这里做什么是正确的?显然我们可以找出一些东西,但不明显。

这是错误的情况下,与上下文关键字棘手;获得成功案例的工作其实非常简单。

但实际上,它并不如此,它是作出的上下文,因为它使上下文不是一个真正的大赢。使“set”和“value”上下文相关是一个很大的胜利,因为我们假设所有类型的人都希望使用“set”和“value”这样的名称来创建局部变量。 “params”甚至不是英文单词,所以任何人都不想使用它。使其具有上下文关系没有什么大的好处,因此该功能的成本是不合理的。

+0

谢谢埃里克。我真的希望能够读懂你的想法。对我来说,似乎有效的案例将是1.是否有params类型可用? 2.如果不是,则必须有Type []形式的类型,后跟一个标识符。我不是像你这样的专家,但你认为这涵盖了所有情况吗?你也是对的,它不是一个英文单词,只是认为它会在一些代码中有用,而不是写入参数/(s)。 – 2011-01-06 18:13:34

2

params关键字似乎只在方法参数声明中有用,但我实际上同意MS,不管怎样,让关键字用于实例名称都不是一个好主意。

也许他们都保留有这样的事情在C#8.0的能力:

params Customers = DB.GetCustomerList(); 

,否则会将params在局部范围内为好。

+0

但那会怎么样?对我来说,在你展示的本地范围内使用它没有多大意义,是吗?我不确定。顺便说一句C#8.0是什么时候出来的? :O – 2011-01-05 22:05:04

+1

我想2017年左右如果我的水晶球是准确的。 – 2011-01-05 22:24:04

+1

琼 - 好问题。我不知道那会做什么。实际上,由于语法错误,我甚至不认为这行代码会在C#8.0中编译。 – Flipster 2011-01-06 02:44:18

9

关于任何其他关键字也可能会有同样的问题。例如,为什么不是“class”上下文,因为它只用于类声明中?

给我一个关键字是一个关键字。我想这极大地简化了编译的词法分析部分,而不必须知道上下文。

顺便说一句,你可以使用@符号,让你声明了一个名为“PARAMS”变量(或任何其他保留关键字):

var @params = new int[] { 1, 2 }; 
+0

谢谢,但如果类是contextual那么他们将如何分离嵌套的类使用?但用params,没有其他地方可以使用它,而且似乎很容易区分它们,但我不是像Eric Lippert这样的编译器大师。 – 2011-01-05 22:02:52

+0

我认为你可以尝试通过寻找典型的类声明语法来创建'class'上下文:[accessibility modifier] class [class name] {}。但是我没有足够的编译器规格来知道这是否可行。 – 2011-01-05 22:09:53

+0

好吧,这是有道理的。 – 2011-01-05 22:18:22

4

埃里克利珀有一篇博客文章涉及contextual and reserved keywords及其历史。虽然它没有明确地解释为什么params在保留列表中(它自1.0开始),这意味着它属于一组保留字,它们将是hard以使上下文相关。

+0

谢谢,这是保留字的用途?我认为这意味着它预留给将来的新潜在用途? – 2011-01-05 22:21:41

+2

@Joan - 有些可能是,但大多数都是*保留*,因为“仅为此目的保留”。 – tvanfosson 2011-01-05 22:24:34