C# 类型推断在几种声明情况下不起作用

C# 类型推断在几种声明情况下不起作用,c#,.net,syntax,language-specifications,C#,.net,Syntax,Language Specifications,为什么下面的陈述完全有效 string a = "someString", b = a, c = a; 但是这个没有编译 var a = "someString", b = a, c = a; 另一个例子是这里 首先,一个错误: 第二个OK: 我见过一个类似的问题,但这里的上下文有点不同: 如果 但是,编译器更难“消化”(即使在这里,我也不认为识别一个为int,另一个为double有什么问题) 应该更不含糊,因为: var a = "so

为什么下面的陈述完全有效

string a = "someString", b = a, c = a;
但是这个没有编译

var a = "someString", b = a, c = a;
另一个例子是这里 首先,一个错误:

第二个OK:

我见过一个类似的问题,但这里的上下文有点不同:

如果

但是,编译器更难“消化”(即使在这里,我也不认为识别一个为int,另一个为double有什么问题)

应该更不含糊,因为:

var a = "someString", // here 'a' is inferred to 'string'
那么下面

b = a; 

也应该推断为字符串,因为
a
已经定义了它的类型…

TLDR:消除此功能是C编译器团队的设计决策

如您所见,IntelliSense已经向您提供了一个错误:

CS0819:隐式类型变量不能有多个声明符

消息表明IntelliSense(当然还有IntelliSense从中获取所有智能的C#编译器)完全了解情况,并且不允许这样做

为什么我说它完全了解情况

使用
var
声明变量就是我们所说的“隐式声明变量类型”。“拥有多个声明器”是指作出声明,如
TypeName a=i,b=j
。因此,
var a=“someString”,b=a(以及您共享的类似片段)可以准确地描述为“使用隐式类型的多个声明器”

所以C#明确地说:“我知道你想做什么,但你做不到。”。但是为什么呢

原因不是类型系统的固有限制之一。这实际上根本不是技术原因。原因在于设计决策被描述为对Eric Lippert提到的问题的回答:


Eric试图说,因为在某些情况下,当试图推断
var
背后的内容时可能存在歧义,所以他们决定完全取消使用隐式类型进行多个声明的能力。

他们否决了投票,因为问题不清楚:代码在什么上下文中?类,函数?是否涉及仿制药?原因与Eric Lippert在该问题上给出的相同,可能会令人困惑。这个特殊的情况并不是一个有用的异常,不需要费心去设计。我重复一遍“恐怕不是一个有用的异常,不需要费心去设计”微软。如果你不喜欢,向他们说明你的理由,而不是我。我也很喜欢,但事实就是这样。我注意到VB.net可以做到这一点,
Dim a=“”,b=a,c=5,d=6.5
我一点也不认为,我只是要求社区了解情况,仅此而已。Eric试图说的是,因为在某些情况下,在试图推断
var
背后的内容时可能存在歧义,他们决定完全取消使用隐式类型进行多个声明的能力。@Serge:推理的问题是“但我的具体情况并不含糊,所以应该允许”是:逻辑上的结论是你最终会写一个非常非常长的“明确的场景”列表,然后必须在编译器中对它们进行编码,然后编写一个错误报告机制,向用户清楚地解释为什么每个不允许的情况都可能是不明确的,然后这些人都会在堆栈溢出上发布相关信息,解释为什么他们的情况不是真正不明确的,以及。。。编译器团队有更大的问题需要解决。@Serge:这就是为什么C#的设计原则是:在划分允许和不允许的代码时,尝试提出一个简单的、可解释的规则,并具有明确的错误报告规则。C#在这方面并不总是成功的,但我们的目标是一种具有可理解规则的语言,而不是一种所有可能的明确代码都是法律程序的语言。@Serge:另请参阅最近的另一篇文章,其中提出了这种设计原则。@EricLippert观察OP的两幅图片。它们类似于一个新的线路差异。一个编译另一个。但我明白你的意思。谢谢你的解释。
var a = "someString", // here 'a' is inferred to 'string'
b = a;