类型推断在几个声明案例中不起作用

type inference not working in several declaration cases

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

string a = "someString", b = a, c = a;

但是这个不编译

var a = "someString", b = a, c = a;

另一个例子在这里 首先,一个错误:

第二次成功:

我看过类似的问题here,但这里的上下文有点不同:

如果

var i = 2, j = 3.4;

编译器更难 'digest' (即使在那里我也没有看到将一个识别为 int 而另一个识别为 double 的问题),但是

var a = "someString", b = a;

应该更不模糊,因为:

var a = "someString", // here 'a' is inferred to 'string'

所以下面

b = a; 

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

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

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

CS0819: Implicitly-typed variables cannot have multiple declarators.

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

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

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

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

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

Eric 试图说,因为在一些 案例中试图推断 var 背后的内容时可能存在歧义,他们决定 完全 消除了使用隐式类型进行多重声明的能力。