c#中switch语句中的"一个常量值"错误

0 c#

switch (Rotation.ToString())
{                  
    case (-Math.PI / 2).ToString():
    // some code
    break;
}
Run Code Online (Sandbox Code Playgroud)

编译器抱怨说(-Math.PI / 2).ToString(),"预期值为常量"这不是常数吗?

Jon*_*Jon 6

没有方法调用是常量值.

顺便说一句,既然Math.PI是a double,你可能不想像在这里那样在"平等"比较中使用它; 有充分证明的陷阱.

单个测试的更好方法是:

var target = -Math.PI / 2;
if (Math.Abs(Rotation - target) < 0.0001) {
    // some code
}
Run Code Online (Sandbox Code Playgroud)

如果有很多分支,没有进入委托区域,你可以这样做:

var specialCases = new[] { -Math.PI, -Math.PI / 2 };
var epsilon = 0.001d;
var index = specialCases.Select((d, i) => Math.Abs(Rotation - d) < epsilon ? i : -1)
                        .Where(i => i != -1).DefaultIfEmpty(-1).First();

switch (index) {
    case 0: // -Math.PI
    break;
    case 1: // -Math.PI / 2
    break;
    default: // No match
    break;
}
Run Code Online (Sandbox Code Playgroud)

不是LINQ的最佳用途,但它可以让你以switch最少的修补回到领土.

  • 它**是**常数,只是编译器无法知道. (4认同)
  • @Jon:是的,我知道,但afaik,swhich-case可以正常使用字符串,不是吗?所以你不需要ReferenceEquals,只需要Equals,它被翻译成"人类会说这和它一样吗?" 或多或少至少. (2认同)
  • @Alxandr:`Math.PI.ToString()`在欧洲可以产生与在美国不同的值,因此编译器不能将值预先计算为常量字符串文字,然后由某人使用.可能在不同的国家/地区检查他们刚刚生成的字符串. (2认同)