C# 使用三元运算符在编译时计算字符串常量
问:有没有办法让下面的示例用C#或类似的语言编译C# 使用三元运算符在编译时计算字符串常量,c#,compiler-errors,C#,Compiler Errors,问:有没有办法让下面的示例用C#或类似的语言编译 public class Switch { public const bool Value = true; } public class A { private const string Id = "foo" + (Switch.Value ? "Dev" : String.Empty); } 这里的主要问题是String.Empty,它不是一个const表达式,尽管它的计算结果总是“” 因此,如果您尝试以下方法: publi
public class Switch
{
public const bool Value = true;
}
public class A
{
private const string Id = "foo" + (Switch.Value ? "Dev" : String.Empty);
}
这里的主要问题是
String.Empty
,它不是一个const
表达式,尽管它的计算结果总是“”
因此,如果您尝试以下方法:
public class Switch
{
public const bool Value = true;
}
public class A
{
private const string Id = "foo" + (Switch.Value ? "Dev" : "");
}
它应该马上编译,至少在C#7.3中是这样
请注意,
const
实际上是平均常数
例如,如果您将上述两个类放在两个不同的项目中,重建两个类,然后将开关.Value
更改为false,并且仅重建该项目,那么A.Value
将保持不变,不会“重新评估”,因为这是在构建时完成的
对于任何不是真正的常量的东西,使用const
通常都不是一个好主意,除非您总是同时重建整个解决方案、所有内容和整个应用程序,那么它可能是正常的
但是,我仍然会为此使用一个
只读
字段/属性,而不是常量
,您可以#ifdef
#else和一个条件编译符号(您将在项目构建设置中设置该符号)要在不使用表达式的情况下设置Switch.Value
和A.ID
的值,我认为您希望在这种情况下使用而不是const@Reniuz预处理器指令是没有选择的,因为我必须为解决方案中的多个项目设置它,这很繁琐。所有这些代码都是同时编译的,对吗?您没有在一个项目中更改Switch.Value
,只重建该项目,并期望A.Id
更改?@participant足够公平。这取决于用例。真是个傻瓜——你说得对!我在3分钟内接受你的回答:)