为什么在C#中不能使用var声明常量?

30

这个:

const int a = 5;

编译没有问题,然而

const var a = 5;

不管什么时候,只要条件不成立,就一直循环执行某段代码:

var a = 5;

这段代码的编译与下面的代码一样:

int a = 5;

为什么?


让我看看我是否理解了...您想知道为什么无法动态地将常量值类型化吗?也许因为如果不知道它的类型,最不想做的事情就是使它变成常量? - Cos Callis
这样怎么样?const是“constant”的简写;var是“variable”的简写。常量和变量是极端相反的,使得const var成为一个矛盾修辞法。 - LukeH
22
@Cos 变量并不是动态类型的。它只是告诉编译器,“嘿,你自己来推断这个变量的类型。” - bevacqua
那么,如果你的“动态”定义不包括“自己想办法解决”,那又怎么样呢? - Cos Callis
22
@Cos Callis:使用var声明的变量在编译时使用类型推断(http://en.wikipedia.org/wiki/Type_inference)进行**静态**类型化。 - Juliet
1
嗯,但如果我的记忆没有出错,在C++中,你可以使用“auto”关键字来达到基本相同的目的,并且你可以使其为const。那么为什么不呢?const与其所代表的类型无关,它只是用来告诉我们,这块内存的使用意图是不变的。 - Mr.Infredible
4个回答

21
var myVariable = "some value";

instead of

System.Collections.Generic.Dictionary<string, System.Collections.ObjectModel.ObservableCollection<System.Data.DataTable>> myVariable = new System.Collections.Generic.Dictionary<string, System.Collections.ObjectModel.ObservableCollection<System.Data.DataTable>>();
var dict = new Dictionary<string, List<Definition>>();

使用匿名类型时,这变得必要

对于常量来说,这不是一个问题。
内置类型名称中最长的带有常量字面值的是decimal; 这不是一个非常长的名称。

可以拥有任意长的enum名称作为常量使用,但是C#编译器团队似乎并不关心这个问题。
首先,如果你正在创建一个常量enum值,你可能会把它放在enum中。
此外,enum名称不应该太长。(不像复杂的泛型类型,它们可以并且经常应该很长)


5
因此,简而言之,是“只因为”? - Kirk Broadhurst
2
@Kirk - 一个意味着另一个,或者至少应该是这样的 - 如果某件事情真的没有用处,那就不应该去做。Eric Gunnerson用不同的话解释了这一点:每个功能都从负100分开始 - Michael Petrotta
17
是的,“const var”很蠢,但如果“var”是一种便利,那么“const”也应该能够做同样的事情:“const s =“ mystring””。https://dev59.com/m3I95IYBdhLWcg3w2Rvz#2614617 - drzaus
3
var 不仅仅是为了简洁方便,还具备冗余性。在类型上写两次是违反 DRY(不要重复自己)原则的。 - Lensflare
4
说常量类型推断是毫无意义的或没有用处是错误的。在C#中可能存在局限,但它仍然很有用。苹果的编程语言Swift对常量进行了类型推断,在那里这是非常合理的。 - Lensflare
显示剩余3条评论

9

这是编译器的限制,Eric Lippert在这里给出了这种限制的原因。


Eric Lippert在这个问题下留了一个评论,可能更加明确:https://dev59.com/m3I95IYBdhLWcg3w2Rvz - Martin Booth

2

没有 var 的常量:

const int Value1 = 1;
const int Value2 = 2;

使用 var 定义的常量(匿名类型属性值在创建后不能更改):

var constants = new { 
  Value1 = 1, 
  Value2 = 2,
};
//use as constants.Value1

0

由于常量必须是内置的数字类型或字符串,因此您实际上并没有节省多少空间;const intconst varint的长度相同,而int可能是最常见的常量类型。然后还有double,它真的不是很长。如果您需要输入大量这些内容,请使用Alt选择功能;-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接