【问题标题】:Why can't I declare a constant using var in C#? [duplicate]为什么我不能在 C# 中使用 var 声明常量? [复制]
【发布时间】:2011-05-26 00:11:32
【问题描述】:

这个:

const int a = 5;

编译得很好,而

const var a = 5;

不...而:

var a = 5;

编译效果和这个一样:

int a = 5;

为什么?

【问题讨论】:

  • 让我看看我是否明白这一点...您想知道“为什么不能动态键入和常量值? “......也许是因为如果它不知道它是什么类型,你最不想做的就是让它保持不变?
  • 这个怎么样? const 是“常数”的简写; var 是“变量”的简写。常量和变量是截然相反的,使const var 成为矛盾的说法。
  • @Cos var 不动态输入。它只是告诉编译器“嘿,请自己输入这些变量。”
  • 那么你对“动态”的定义是什么,不包括“自己弄清楚”?
  • @Cos Callis:使用var 声明的变量在编译时使用类型推断 (en.wikipedia.org/wiki/Type_inference) 进行静态类型化。

标签: c# declaration implicit-declaration


【解决方案1】:

var 关键字旨在让您免于编写冗长的复杂类型名,这些类型名不能是常量。

能写这样的声明很方便

var dict = new Dictionary<string, List<Definition>>();

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

对于常量,这不是问题。
具有常量字面量的最长内置类型名是decimal;这不是一个很长的名字。

可以有任意长的 enum 名称,可以用作常量,但 C# 编译器团队显然并不关心这一点。
一方面,如果你要创建一个常量 enum 值,你不妨把它放在 enum 中。
此外,enum 名称不应太长。 (与复杂的泛型类型不同,后者可以而且经常应该这样做)

【讨论】:

  • 所以,总而言之,“只是因为”?
  • @Kirk - 一个暗示另一个,或者至少应该 - 如果某事不是真的有用,就不应该这样做。 Eric Gunnerson 用different words 解释了这一点:每个功能都以负 100 分开始
  • 是的const var 是愚蠢的,但如果var 是一种方便,那么const 应该能够做同样的事情:const s = "mystring"stackoverflow.com/a/2614617/1037948
  • var 不仅仅是简洁和方便。这也与冗余有关。将类型写两次是违反 DRY(不要重复自己)原则的。
  • 说对常量的类型推断毫无意义或无用是错误的。这可能是 C# 的限制,但它会很有用。 Apple 的编程语言 Swift 对常量进行类型推断,这在其中非常有意义。
【解决方案2】:

这是一个编译器限制,该限制的原因由 Eric Lippert here 给出

【讨论】:

【解决方案3】:

没有 var 的常量:

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

带有 var 的常量(匿名类型属性值创建后无法更改):

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

【讨论】:

    【解决方案4】:

    由于常量必须是内置数字类型或string,因此您并没有真正节省多少; const intconst var 的长度相同,int 可能是最常见的常量类型。然后是double,它真的没有那么长。如果您有很多要输入的内容,请使用 Alt 选择功能 ;-)

    【讨论】:

      猜你喜欢
      • 2015-05-02
      • 1970-01-01
      • 1970-01-01
      • 2012-05-07
      • 2019-07-19
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 2015-01-21
      相关资源
      最近更新 更多