我问的原因是,它只在方法参数声明中有效,不是吗?我试图在函数体内创建一个名为“params”的变量,但当然这不是什么大问题,只是想知道MS选择使其成为全局关键字而不是上下文的原因。为什么params关键字不是上下文的?
回答
tvanoffson的答案推测,很难做出“参数”的上下文。它实际上不会那么难。考虑:
void M(params x)
在这种情况下,假设我们要做的是首先尝试找到一个类型'params'。如果我们能找到一个,那就太棒了,我们完成了。如果我们不能,那么我们有一个问题。假设,而不是x它是
void M(params Int32)
显然,这是一个错误,但什么错误?我们是否应该假设Int32是参数名称,并提供错误“您缺少类型”?我们是否应该假设Int32是类型,并给出错误,指出该类型必须是数组类型,并且缺少标识符?我们是否应该给出一个错误,说没有名为'params'的类型?这里做什么是正确的?显然我们可以找出一些东西,但不明显。
这是错误的情况下,与上下文关键字棘手;获得成功案例的工作其实非常简单。
但实际上,它并不如此,它是难作出的上下文,因为它使上下文不是一个真正的大赢。使“set”和“value”上下文相关是一个很大的胜利,因为我们假设所有类型的人都希望使用“set”和“value”这样的名称来创建局部变量。 “params”甚至不是英文单词,所以任何人都不想使用它。使其具有上下文关系没有什么大的好处,因此该功能的成本是不合理的。
谢谢埃里克。我真的希望能够读懂你的想法。对我来说,似乎有效的案例将是1.是否有params类型可用? 2.如果不是,则必须有Type []形式的类型,后跟一个标识符。我不是像你这样的专家,但你认为这涵盖了所有情况吗?你也是对的,它不是一个英文单词,只是认为它会在一些代码中有用,而不是写入参数/(s)。 – 2011-01-06 18:13:34
params关键字似乎只在方法参数声明中有用,但我实际上同意MS,不管怎样,让关键字用于实例名称都不是一个好主意。
也许他们都保留有这样的事情在C#8.0的能力:
params Customers = DB.GetCustomerList();
,否则会将params
在局部范围内为好。
但那会怎么样?对我来说,在你展示的本地范围内使用它没有多大意义,是吗?我不确定。顺便说一句C#8.0是什么时候出来的? :O – 2011-01-05 22:05:04
我想2017年左右如果我的水晶球是准确的。 – 2011-01-05 22:24:04
琼 - 好问题。我不知道那会做什么。实际上,由于语法错误,我甚至不认为这行代码会在C#8.0中编译。 – Flipster 2011-01-06 02:44:18
关于任何其他关键字也可能会有同样的问题。例如,为什么不是“class”上下文,因为它只用于类声明中?
给我一个关键字是一个关键字。我想这极大地简化了编译的词法分析部分,而不必须知道上下文。
顺便说一句,你可以使用@
符号,让你声明了一个名为“PARAMS”变量(或任何其他保留关键字):
var @params = new int[] { 1, 2 };
谢谢,但如果类是contextual那么他们将如何分离嵌套的类使用?但用params,没有其他地方可以使用它,而且似乎很容易区分它们,但我不是像Eric Lippert这样的编译器大师。 – 2011-01-05 22:02:52
我认为你可以尝试通过寻找典型的类声明语法来创建'class'上下文:[accessibility modifier] class [class name] {}。但是我没有足够的编译器规格来知道这是否可行。 – 2011-01-05 22:09:53
好吧,这是有道理的。 – 2011-01-05 22:18:22
埃里克利珀有一篇博客文章涉及contextual and reserved keywords及其历史。虽然它没有明确地解释为什么params在保留列表中(它自1.0开始),这意味着它属于一组保留字,它们将是hard以使上下文相关。
谢谢,这是保留字的用途?我认为这意味着它预留给将来的新潜在用途? – 2011-01-05 22:21:41
@Joan - 有些可能是,但大多数都是*保留*,因为“仅为此目的保留”。 – tvanfosson 2011-01-05 22:24:34
- 1. Objective-C上下文中__typeof关键字的含义是什么?
- 2. 什么是typeof关键字
- 3. 什么是RCS关键字?
- 4. 为什么不使用new关键字
- 5. 为什么params [:id]是零?
- 6. 以下关键的标准是什么?
- 7. 下面的driver_options params是什么意思?
- 8. 为什么回归和throw关键字的不是静态块
- 9. var关键字不是推断RepeaterItem的类型,为什么?
- 10. 什么是“关键点”[opencv上下文],FAST,GetStarKeypoints等有什么作用?
- 11. swift中的“as”关键字是什么
- 12. Xcode中的(named)关键字是什么?
- 13. 什么是PLSQL中的RESULT关键字?
- 14. 什么是Java的“自我”关键字
- 15. $ this关键字的含义是什么?
- 16. JavaScript中的`name`关键字是什么?
- 17. 什么是Swift中的“open”关键字?
- 18. “With”关键字的功能是什么
- 19. Java中的native关键字是什么?
- 20. 什么是Swift中的'const'关键字?
- 21. 什么是Java中的关键字?
- 22. 什么是synchronized关键字的使用?
- 23. C++中的explicit关键字是什么?
- 24. 为什么 '这个' 关键字不是引用在C++
- 25. 为什么这段代码编译(url不是关键字)?
- 26. 以下声明/关键字背后的解释是什么?
- 27. 对于0.1以上的双字补语,上下文无关文法是什么?
- 28. 为什么你不能在迭代器上下文中使用不安全的关键字?
- 29. 为什么字符串不需要新的关键字
- 30. 什么是CUDA上下文?
不知道为什么部分,但如果你真的想在c#中使用这个作为变量名称前言变量名称@:int @params = 1; – Derrick 2011-01-05 21:44:16