仅在一个操作数上进行类型转换与在两个操作数上进行类型转换
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
下面的函数 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