switch (Rotation.ToString())
{
case (-Math.PI / 2).ToString():
// some code
break;
}
编译器抱怨(-Math.PI / 2).ToString()
,“预期值为常量”
这不是一个常数吗?
答案 0 :(得分:6)
没有方法调用是常量值。
顺便说一下,由于Math.PI
是double
,您可能不希望在“平等”比较中使用它,就像您在这里所做的那样;有充分记录的陷阱。
单一测试的更好方法是:
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;
}