【问题标题】:type inference not working in several declaration cases类型推断在几种声明情况下不起作用
【发布时间】:2021-01-07 22:46:32
【问题描述】:

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

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

但是这个不能编译

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

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

第二个确定:

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

如果

var i = 2, j = 3.4;

然而,编译器更难“消化”(即使在那里我认为将一个识别为 int 而另一个识别为 double 也没有问题)

var a = "someString", b = a;

应该更不模棱两可,因为:

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

所以下面

b = a; 

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

【问题讨论】:

  • 他们投了反对票,因为问题不清楚:代码在什么上下文中?类,功能?是否涉及泛型?
  • 原因与 Eric Lippert 在该问题上给出的相同,可能会造成混淆。而且那个特殊情况并不是一个足够有用的例外来打扰设计。
  • 我再说一遍“这不是一个足够有用的例外来打扰设计”
  • 微软,恐怕。如果您不喜欢它,请向他们提出您的意见,而不是我。我也会喜欢它,但它就是这样。我注意到VB.net 可以做到这一点Dim a = "", b = a, c = 5, d= 6.5
  • 我什么都没想,只是问问社区了解情况而已。

标签: c# .net syntax language-specifications


【解决方案1】:

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

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

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

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

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

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

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

原因不是类型系统的固有限制之一。这实际上根本不是技术原因。原因是设计决策被描述为 Eric Lippert 提到的问题的答案:https://stackoverflow.com/a/4950600/10560397

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

【讨论】:

  • Eric 想说的是,因为在 一些 案例中试图推断 var 背后的内容时可能存在歧义,他们 决定完全消除使用隐式类型进行多个声明的能力。
  • @Serge:推理的问题是“但我的具体情况并不模棱两可,所以应该允许”是:合乎逻辑的结论是你最终写了一个非常非常长的“明确场景”列表",然后必须在编译器中对它们中的每一个进行编码,然后编写一个错误报告机制,向用户清楚地解释为什么每个不允许情况可能是模棱两可的,然后这些人都在 Stack Overflow 上发帖解释为什么 他们的 情况并不真正模棱两可,而且……编译器团队还有更大的问题要解决。
  • @Serge:这就是为什么 C# 的一个设计原则是:在区分允许和不允许的代码时,尽量想出一个 简单的、可解释的规则和一个 明确错误报告规则。 C# 在这方面并不总是成功,但我们的目标是一种具有可理解规则的语言,而不是一种所有可能的明确代码都是合法程序的语言。
  • @Serge:另请参阅 stackoverflow.com/questions/65613857/…,了解有关此设计原则的另一篇文章。
  • @EricLippert 观察 OP 的两个图像。它们类似于只是一个新的线路差异。一个编译另一个不编译。但我明白你的意思。谢谢你的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
相关资源
最近更新 更多