Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用三元运算符在编译时计算字符串常量_C#_Compiler Errors - Fatal编程技术网

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

问:有没有办法让下面的示例用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
表达式,尽管它的计算结果总是
“”

因此,如果您尝试以下方法:

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分钟内接受你的回答:)