使用const boolean时的编译器警告

Ala*_*inD 5 c#

我使用以下代码偶然发现了令人惊讶的编译器警告:

private const bool DEFAULT_SETTING = false;
//...
string aString = (DEFAULT_SETTING) ? "1" : "0";
Run Code Online (Sandbox Code Playgroud)

它会生成警告warning CS0429: Unreachable expression code detected.

在最初困惑之后,我意识到编译器没有错,因为值DEFAULT_SETTING是常量而且不能改变.因此,? "1"永远无法到达三元运算符的一部分.但编译器也不完全正确,因为我自己或未来的开发人员可能希望(或需要)在不破坏代码的情况下更改默认值.

有没有更好的方法来使用类似于上面的上下文的默认设置,不会产生警告?

注意:您可能想知道我为什么要转换false"0"...它是保存到设置XML文件.当文件丢失时,软件会自动生成带有默认设置的闪亮的新XML文件.

Eri*_*ert 14

有没有更好的方法来使用类似于上面的上下文的默认设置,不会产生警告?

是.

但首先:立即停止使用SHOUTY_SNAKE_CASING.这让你看起来像是一名C程序员.C#使用camelCasing和PascalCasing.

现在回答你的问题.如果命名值可以更改,那么根据定义它不是常量.仅将常量用于永不改变的事物.Pi是一个常数.金原子中的质子数是常数.程序的名称不是常量,无论是调试还是零售构建都不是常量,依此类推.那些事情改变了.

编译器有权对您的代码发出警告,因为它似乎是根据永不改变的东西做出选择,因此可能是一个错误.

这不仅仅是一个惯例; C#语言的语义假设常量不会永远改变.举例来说,如果你有一个公共不断Foo在Foo.DLL,它是由代码Bar.EXE消耗掉,重新编译Foo.DLL用不同的值Foo没有更新的值Foo自动Bar.EXE.C#编译器将假定Foo永远不会改变,使得复制其在Bar.EXE价值.

为了表示这个概念"这个东西在我的程序中不会改变,但它可能会在我的程序的不同实例中发生变化"使用readonly:

private static readonly bool DefaultSetting = false;
...
string aString = DefaultSetting ? "1" : "0";
Run Code Online (Sandbox Code Playgroud)