【问题标题】:Is there a way to concat string with char as a const?有没有办法将字符串与 char 作为 const 连接起来?
【发布时间】:2012-03-16 15:36:07
【问题描述】:

如果我尝试

const char NoChar = (char)8470; //№
const char TmChar = (char)8482; //™
const string IdDisplayName = "Clements" + TmChar + ' ' + NoChar;

会抛出编译错误:

分配给“{0}”的表达式必须是常量

据我了解,发生此错误是因为当一个 char 是因为字符串连接运算符 (+) 在内部调用连接对象上的ToString

我的问题是是否有办法(非托管?)来做到这一点。

我需要将该常量作为属性传递,它应该在客户端生成。

更丑陋的解决方法(将根据您的答案查看更丑陋的地方......)是对该属性进行子类化(它是密封的,必须进行一些反编译和复制粘贴工作)并将其嵌入为非常量将有可能。

【问题讨论】:

标签: c# string char constants


【解决方案1】:

我简单地假设:

const string NoChar = "\x2116"; //№ - Unicode char 8470
const string TmChar = "\x2122"; //™ - Unicode char 8482
const string IdDisplayName = "Clements" + TmChar + " " + NoChar;

不能接受吗?

【讨论】:

    【解决方案2】:

    您可以通过\u 转义直接在字符串中指定Unicode 字符值。所以const string IdDisplayName = "Clements\u2122 \u2116"; 应该能得到你想要的。

    【讨论】:

    • 2122 == 8482的公式是什么?
    • @Shimmy 2122 是十进制数 8482 的十六进制(以 16 为底)表示。
    • 我认为您的回答符合 (msdn.microsoft.com/en-us/library/e6w8fe1b%28v=vs.71%29.aspx) 中的这句话“常量表达式是可以在编译时完全评估的表达式。因此,常量的唯一可能值引用类型是字符串和空值。但我真的不明白评估完全意味着什么,不是在编译时完全评估了 OP 中的连接!?
    • 可能“完全评估”指的是最终字符串,而不是最终将在运行时成为一个字符串的片段!?专家们对为什么这是有意义的任何想法表示赞赏。
    • 因为当您创建"string" + ... objects to concatenate... 时,它会在内部调用所有这些对象的ToString,然后连接字符串字符串。现在显然ToString 是一个运行时方法,绝对可以称为'const'。 Here is a demo.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    相关资源
    最近更新 更多