仅对一个操作数进行类型转换与对两个操作数进行类型转换

问题描述

下面的函数 CarbonEquivalentFactor 包含一个错误,即结果四舍五入到最接近的整数,而不是双精度类型的十进制值。

public double CarbonEquivalentFactor(int fromNoCarbonAtoms,int toNoCarbonAtoms)
{
    return fromNoCarbonAtoms / toNoCarbonAtoms;
}

向其中一个变量添加类型转换有效并且函数返回正确的十进制值作为双精度

public double CarbonEquivalentFactor(int fromNoCarbonAtoms,int toNoCarbonAtoms)
{
    return (double)fromNoCarbonAtoms / toNoCarbonAtoms;
}

向两个操作数添加类型转换似乎是合乎逻辑的,如下所示:

public double CarbonEquivalentFactor(int fromNoCarbonAtoms,int toNoCarbonAtoms)
{
    return (double)fromNoCarbonAtoms / (double)toNoCarbonAtoms;
}

但是,Visual Studio 给了我 IDE0004 提示,“删除不必要的强制转换”。使用两种类型转换编译和执行函数也会重新引入相同的错误,即结果四舍五入为最接近的整数。

为什么会这样?

该项目采用 .NET 标准 2.0。我在 .NET Core 3.1 项目中使用 MS 测试框架 2.1.1 对功能进行单元测试。

[DataTestMethod]
[DaTarow(5,1)]
[DaTarow(3,1)]
[DaTarow(1,3)]
[DaTarow(0,1)]
[DaTarow(2,-1)]
[DaTarow(-2,-2)]
[DaTarow(3242424,9343243)]
public void CarbonEquivalentFactorTest(int from,int to)
{
    var result = Emission.CarbonEquivalentFactor(from,to);
    var resultNET= emissionsNET.CarbonEquivalentFactor(from,to);
    Assert.AreEqual(result,resultNET);
}

Emission 类是 C++ 中的 COM 对象,而其他 emmissionNET 类是移植到 C# 的 .NET 类。当参数为 1 和 3 时,.NET 函数返回 0。当对除法中的两个操作数进行 double 类型转换时,如下所示:

public double CarbonEquivalentFactor(int fromNoCarbonAtoms,int toNoCarbonAtoms)
{
    return (double)fromNoCarbonAtoms / (double)toNoCarbonAtoms;
}

更新 它一定是我的设置或 Visual Studio 中的一些小故障。现在我无法重现上述错误,并且当 in 参数为 1 和 3 时,该函数返回 0.3333。 无论如何感谢您的时间和帮助!我今天至少提高了我的 C# 技能。

解决方法

C# 不能对两个不同类型的值执行算术运算。此处必须执行双除,因为其中一个变量已转换为 double,另一个为 int

因此,会自动执行对另一个 (int) 操作数的扩大转换。

Remove unnecessary cast (IDE0004) 只是告诉您不需要第二次显式转换,因为它是由 C# 自动完成的。因此,具有一个和两个显式转换的表达式是等效的。

事实上,您可以保持第二次转换,代码将按预期编译和工作。提示只是告诉您可以安全地简化代码。

见:Type Conversion Tables in .NET / Widening Conversions


在 C# 交互窗口中快速测试:

> 1/3
0
> (double)1/3
0.33333333333333331
> 1/(double)3
0.33333333333333331
> (double)1/(double)3
0.33333333333333331