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

时间:2011-08-23 15:50:33

标签: c#

switch (Rotation.ToString())
{                  
    case (-Math.PI / 2).ToString():
    // some code
    break;
}

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

3 个答案:

答案 0 :(得分:6)

没有方法调用是常量值。

顺便说一下,由于Math.PIdouble,您可能不希望在“平等”比较中使用它,就像您在这里所做的那样;有充分记录的陷阱。

单一测试的更好方法是:

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

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

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;
}

不是LINQ的最佳用途,但它可以让您回到switch领域,而且只需要进行修改。

答案 1 :(得分:1)

Jon回答了问题的要点:从编译器的角度来看,方法调用的结果从未被认为是constant。你可以这样做:

string i = (-Math.PI / 2).ToString();
switch(i)
{
    case "-1.5707963267949": Console.WriteLine("hi");
        break;
}

但是,请记住double.ToString()可能会产生不同的结果,具体取决于当前的文化信息。 (因此它不能保持不变。)所以你最好直接使用double值,并根据switch语句的大小,创建一些if/else语句或创建Dictionary键入您要匹配的常量值。

当然,Jon的初始警告仍然适用:在执行浮点逻辑时,您可以很容易地得到应该-pi/2的值,但这不是' t 完全 -pi/2,在这种情况下,您的支票将失败。这是龙。

答案 2 :(得分:0)

也许试试:

const var SomeVar = (-Math.PI / 2).ToString();
switch (Rotation.ToString())
{                  
    case SomeVar:
        // some code
    break;
}