Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么params关键字没有上下文关系?_C#_.net_Compiler Construction - Fatal编程技术网

C# 为什么params关键字没有上下文关系?

C# 为什么params关键字没有上下文关系?,c#,.net,compiler-construction,C#,.net,Compiler Construction,我问的原因是,它只在方法参数声明中有效,不是吗?我试图在函数体中创建一个名为“params”的变量,但这当然不是什么大问题,只是想知道为什么MS选择将其设置为全局关键字而不是上下文关键字。params关键字看起来只在方法参数声明中有用,但我实际上同意MS的观点,不管怎样,让关键字用作实例名称并不是一个好主意 也许他们保留了在C#8.0中实现类似功能的能力: 或者也允许在本地范围内使用参数。对于任何其他关键字都可以询问相同的问题。例如,既然“类”只在类声明中使用,为什么它不是上下文的 对我来说,关

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

params关键字看起来只在方法参数声明中有用,但我实际上同意MS的观点,不管怎样,让关键字用作实例名称并不是一个好主意

也许他们保留了在C#8.0中实现类似功能的能力:


或者也允许在本地范围内使用
参数。

对于任何其他关键字都可以询问相同的问题。例如,既然“类”只在类声明中使用,为什么它不是上下文的

对我来说,关键字就是关键字。我想它极大地简化了编译中的词法分析部分,而不必考虑上下文

另外,您可以使用
@
符号声明名为“params”(或任何其他保留关键字)的变量:


埃里克·利珀特(Eric Lippert)在博客上发表了一篇文章,介绍了他们的经历。虽然它没有明确解释为什么params在保留列表中(从1.0开始),但它意味着它属于一组很难设置上下文的保留字。

tvanoffson的答案推测,很难将“params”设置为上下文。其实没那么难。考虑:

void M(params x)
假设在这种情况下,我们要做的是首先尝试找到类型“params”。如果我们能找到一个,太好了,我们完成了。如果我们不能,那我们就有点问题了。例如,假设它不是x,而是x

void M(params Int32)
很明显这是个错误,但是什么错误呢?我们是否应该假定Int32是参数名,并给出错误“您缺少类型”?我们是否应该假定Int32是该类型,并给出一个错误,说明该类型必须是数组类型,并且缺少标识符?我们是否应该给出一个错误,说明没有名为“params”的类型?在这里应该做什么?很明显,我们可以找出一些问题,但并不明显

对于上下文关键字来说,错误案例很棘手;让成功案例发挥作用实际上相当简单


但事实上,与其说是很难实现上下文化,不如说实现上下文化并不是一个真正的大胜利。将“set”和“value”上下文化是一个巨大的成功,因为我们假设所有类型的人都希望用“set”和“value”这样的名称来创建局部变量。“params”甚至不是一个英语单词,所以似乎很少有人愿意使用它。将其设置为上下文并没有多大好处,因此该功能的成本是不合理的。

不确定为什么,但如果您真的想在c中使用它作为变量名,请在变量名前面加上@:int@params=1;谢谢,但若类是上下文的,那个么它们如何区分嵌套类的用法呢?但是对于params,没有任何其他地方可以使用它,而且似乎很容易区分它们,但我不是像Eric Lippert那样的编译器大师。我认为您可以通过查找典型的类声明语法:[可访问性修饰符]类[类名]{},尝试将“类”上下文化。但我对编译器规范还不够了解,不知道这是否切实可行。假设您有“class{}class get{}class C{public class D{get”--此时您不知道D是否是一个嵌套类声明,其字段(或方法)类型为“get”,名称丢失,或者D是否是“class”类型的属性缺少getter主体。这种情况显然是人为造成的,但如果我们支持该功能,那么我们就必须针对所有可能出现的此类情况提出合理的错误。这需要大量的分析、大量的规范编写和大量的功能测试,而这些功能几乎对任何人都没有好处。顺便说一句,当我在VBScript 5我们确实在VBScript中将“Class”设为一个新的保留字,而不是将其设置为上下文。VBScript的语法和语义使得很难确定“Class Foo”是对类的介绍,还是对带有参数“Foo”的过程“Class”的调用.不得不添加一个新的保留字让人很烦恼,但替代词的效果更差。谢谢Eric,这正是我对“类”的想法关键词与上下文相关。但这会有什么作用?对我来说,在你展示的本地范围内使用它没有多大意义,是吗?我不确定。顺便说一句,C#8.0什么时候问世?:我想2017年左右,如果我的水晶球是准确的。琼-好问题。我不知道这会有什么作用。事实上,我甚至不认为这行代码会符合我的要求由于语法错误,在C#8.0中使用了le。谢谢,这就是保留字的用途?我以为这意味着它是为将来的新潜在用途保留的?@Joan-有些可能是,但大多数保留为“仅用于此目的”谢谢Eric。我真的希望读一下你的想法。对我来说,有效的案例应该是1。有可用的params类型吗?2.如果没有,那么必须有类型[]形式的类型,后面跟着一个标识符。我不是像你这样的专家,但你认为这涵盖了所有情况吗?你也是对的,它不是一个英文单词,只是认为它在某些代码中会有用,而不是编写参数/(s)。
void M(params x)
void M(params Int32)