有没有一种方法可以将字符串与字符作为常量连接起来?

4

如果我尝试

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

将会抛出编译错误:

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

据我所知,这个错误是因为当一个字符被字符串连接操作符(+)内部调用ToString时发生的。

我的问题是是否有一种方法(非托管?Tongue)可以解决这个问题。

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

更糟糕的解决方法(将根据您的回答来决定哪个更糟糕...)是子类化该属性(该属性是密封的,需要进行一些反编译和复制粘贴工作),然后将其嵌入为非常量即可。


这篇文章可能会对你有所帮助:https://dev59.com/pXA75IYBdhLWcg3wP2kg - Pritam Karmakar
2个回答

6

您可以通过使用\u转义字符直接在字符串中指定Unicode字符值。因此,const string IdDisplayName = "Clements\u2122 \u2116"; 可以得到您想要的结果。


2122 == 8482 的公式是什么? - Shimmy Weitzhandler
1
@Shimmy 2122是十进制数8482的十六进制(基数16)表示。 - dlev
我认为你的答案符合这个语句(http://msdn.microsoft.com/en-us/library/e6w8fe1b%28v=vs.71%29.aspx)的要求。“常量表达式是一种可以在编译时完全计算的表达式。因此,引用类型的常量只有字符串和null两种可能的值。但我并不真正理解什么是完全计算,难道OP中的连接不是在编译时完全计算吗?!” - Isaac
也许“fully evaluated”指的是最终字符串,而不是最终在运行时变成一个字符串的那些部分!请专家们分享一下这样做的合理性。 - Isaac
因为当你使用"string" + ... objects to concatenate...时,它会内部调用所有这些对象的ToString方法,然后连接字符串。现在显然ToString是一个可以被称为'const'的运行时方法。这里有一个演示 - Shimmy Weitzhandler

3
我假设只需要简单地:
const string NoChar = "\x2116"; //№ - Unicode char 8470
const string TmChar = "\x2122"; //™ - Unicode char 8482
const string IdDisplayName = "Clements" + TmChar + " " + NoChar;

这是不可接受的吗?


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