【问题标题】:Combine a character constant and a string literal to create another constant结合一个字符常量和一个字符串文字来创建另一个常量
【发布时间】:2016-09-14 00:55:47
【问题描述】:

这些天我主要使用 C# 编写代码,但多年来我一直使用 VB.NET 编写代码。在 VB 中,我可以将一个字符常量和一个字符串文字组合起来创建其他常量,这非常方便:

Const FileExtensionSeparatorCharacter As Char = "."c
Const BillingFileTypeExtension As String = FileExtensionSeparatorCharacter & "BIL"

现在我想在 C# 中做同样的事情:

const char FileExtensionSeparatorCharacter = '.';
const string BillingFileTypeExtension = FileExtensionSeparatorCharacter + "BIL";

但这会给我一个编译器错误:

分配给“BillingFileTypeExtension”的表达式必须是 常数

我在 C# 中不能这样做有什么原因吗?

【问题讨论】:

  • FileExtensionSeparatorCharacter 是一个糟糕的变量名。为什么不FileExtensionSeparator,或者最好的FileExtSep
  • 不确定我对 Visual Studio 的体验是否是典型的,但我只在声明期间输入完整的变量名称。每隔一次,我只是将键盘和我想到的变量混合在一起,神奇地自动完成。
  • 不错的投反对票神秘客人先生。尽管问题的原因是一个简单的开发人员错误,但这仍然是一个合理的问题。如果开发人员习惯于 VB.NET,这是一种通常更“悠闲”的语言,可能会出现这样的问题。
  • 我认为人们经常混淆投票的目的。人们认为“愚蠢”的问题——例如。这个人非常缺乏经验,并且提出的问题对于更有经验的人来说是显而易见的答案 - 通常在不应该发生的情况下被否决。在这种情况下,我敢打赌,投反对票的选民读了这个问题,不知道答案,读了答案,然后就像“哦,是的......呃,这有道理......多么愚蠢的问题”和投了反对票。
  • @cat 因为第一个前者的歧义为零。很难混淆冗长的标识符,因为它很容易阅读,因为我们是英语读者,首先是代码阅读者。 FileExtSep 是仅次于“FES”的第二差。

标签: c# .net vb.net vb.net-to-c#


【解决方案1】:

我在 C# 中不能这样做有什么原因吗?

是的,但你不会喜欢它。 char + string 中涉及的字符串连接涉及在 char 上隐式调用 ToString()。这不是你可以在常量表达式中做的事情之一。

如果你把它们都做成字符串,那很好:

const string FileExtensionSeparator = ".";
const string BillingFileTypeExtension = FileExtensionSeparator + "BIL";

现在是string + string 连接,可以出现在常量表达式中。

替代方法是只使用static readonly 字段:

const char FileExtensionSeparatorCharacter = '.';
static readonly string BillingFileTypeExtension = FileExtensionSeparatorCharacter + "BIL";

【讨论】:

  • 很好,想知道为什么它不是编译时,隐式 ToString 是有道理的。
  • 我现在看到了,但仍然...为什么 VB 编译时间没问题ToString
  • @AdamV -- VB 不使用单引号作为字符文字。带有双引号的文字后跟 c 是您表示 char 文字的方式。
  • @roryap:基本上它有不同的规则。我不熟悉 VB 规范,但 C# 5 规范在第 7.19 节中列出了常量表达式中的操作。
【解决方案2】:

我在这里必须假设,将字符添加到字符串不被视为编译时常量,而是运行时操作。如果您将 FileExtensionSeparatorCharacter 的类型更改为字符串,您将可以正常编译。

const string FileExtensionSeparatorCharacter = ".";
const string BillingFileTypeExtension = FileExtensionSeparatorCharacter + "BIL";

【讨论】:

    猜你喜欢
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多