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

typecast on only one operand vs typecast on both operands

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

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

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

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 Test framework 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 class 是 C++ 中的 COM 对象,另一个 emissionsNET 是移植到 C# 的 .NET class。 .NET 函数 returns 当参数为 1 和 3 时为 0。并且当对除法中的两个操作数进行双精度类型转换时,如下所示:

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

更新 这一定是我的设置问题或 Visual Studio 中的一些故障。现在我无法重现上述错误,以及参数为 1 和 3 时的函数 returns 0.3333。 无论如何感谢您的时间和帮助!我今天至少提高了我的 C# 技能。

C# 无法对两个不同类型的值执行算术运算。在这里,必须执行双除法,因为其中一个变量已转换为 double,另一个为 int.

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

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

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

参见:Type Conversion Tables in .NET / Widening Conversions


在 C# Interactive 中快速测试 window:

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