繁体   English   中英

为什么var会被解析为Double而不是Long?

[英]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());

存在从Int64Double的隐式转换,但不是另一种方式(由于该方向可能会丢失精度)。

由于条件的两个“分支”需要解析为相同的类型,因此b的类型最终被推断为Double

你可以隐含地将long投入到double

你不能隐含地将一个doublelong

所以C#编译器决定你的变量类型的唯一可能性是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM