类型推断在几个声明案例中不起作用
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
背后的内容时可能存在歧义,他们决定 到 完全 消除了使用隐式类型进行多重声明的能力。
为什么下面的陈述是完全有效的
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
背后的内容时可能存在歧义,他们决定 到 完全 消除了使用隐式类型进行多重声明的能力。