[英]Why does var get resolved as a Double and not Long?
在下面的代码中,我希望var
可以解析为Int64
,但它会被解析为double
。 为什么会这样?
string a = "1234";
bool asInt = true;
var b = (asInt) ? Int64.Parse(a) : Double.Parse(a) ;
Console.WriteLine(b.GetType());
存在从Int64
到Double
的隐式转换,但不是另一种方式(由于该方向可能会丢失精度)。
由于条件的两个“分支”需要解析为相同的类型,因此b
的类型最终被推断为Double
。
因为编译器需要推断一个类型,它可以保存Int64.Parse(a)
和Double.Parse(a)
而不需要显式转换。 如果推断出long
,那么表达式的另一个扭曲就会失去精度。
如果需要区分类型,则必须声明两个变量并重写代码:
if (asInt)
{
var b = Int64.Parse(a); // will infer a `long`
Console.WriteLine(b.GetType());
}
else
{
var b = Double.Parse(a); // will infer a `double`
Console.WriteLine(b.GetType());
}
C#编译器从三元的两种返回类型之间的公分母推断出类型。 Int64可以隐式转换为Double。 反之则并非如此。
请注意,代码示例中的布尔状态与推断类型无关。
这是?:
运算符的工作。 它应该将所有结果转换为一种类型。
PS你知道+
运算符的类似行为:
string a = "1234";
var b = Int64.Parse(a) + Double.Parse(a) ;
Console.WriteLine(b.GetType());
PPS要拥有你想要的东西你应该使用object
:
string a = "1234";
bool asInt = true;
object b;
if(asInt) b=Int64.Parse(a); else b=Double.Parse(a);
Console.WriteLine(b.GetType());
PPPS另一种选择是:
string a = "1234";
#if asInt
Int64 b = Int64.Parse(a);
#else
Double b = Double.Parse(a);
#endif
Console.WriteLine(b.GetType());
定义asInt使用
#define asInt
我很惊讶没有人指出如果你知道这个值是合法的 long
值,你可以用显式转换来改变编译器的行为,并且只使用 long
。
这可能有用也可能没有用,具体取决于确定asInt
值的条件,具体取决于您打算对表达式的结果做什么。 这是一个例子:
string a = "1234.56";
bool asDouble = a.Contains(".");
var b = asDouble ? (long)Double.Parse(a) : Int64.Parse(a);
Console.WriteLine(b.GetType());
实际上,在这个例子中,您不需要条件运算符; 这也会奏效:
string a = "1234.56";
var b = (long)Double.Parse(a);
Console.WriteLine(b.GetType());
换句话说,最好的解决方案可能不会使用三元运算符,但问题并没有提供足够的上下文来知道。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.