C# 仅对一个操作数执行类型转换,而对两个操作数执行类型转换

C# 仅对一个操作数执行类型转换,而对两个操作数执行类型转换,c#,.net,.net-standard-2.0,C#,.net,.net Standard 2.0,下面的函数CarbonEquivalentFactor包含一个bug,其中结果被舍入到最接近的整数,而不是双精度类型的十进制值 public double CarbonEquivalentFactor(int fromNoCarbonAtoms, int toNoCarbonAtoms) { return fromNoCarbonAtoms / toNoCarbonAtoms; } 将类型转换添加到其中一个变量会起作用,并且该函数将以双精度形式返回正确的十进制值 public doub

下面的函数CarbonEquivalentFactor包含一个bug,其中结果被舍入到最接近的整数,而不是双精度类型的十进制值

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;
}
然而,VisualStudio给了我IDE0004提示,删除不必要的强制转换。使用两种类型强制转换编译和执行函数也会重新引入相同的错误,即结果被四舍五入到最接近的整数

为什么会这样

该项目采用.NET标准2.0。我在.NETCore3.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);
}

发射类是C++中的COM对象,另一个EXISSnet是.NET类移植到C。NET参数在参数为1和3时返回0。在两个操作数上按除法进行双类型强制转换时,如下所示:

public double CarbonEquivalentFactor(int fromNoCarbonAtoms, int toNoCarbonAtoms)
{
    return (double)fromNoCarbonAtoms / (double)toNoCarbonAtoms;
}
更新 这一定是由于我的设置或VisualStudio中的某个故障造成的。现在我无法重现上述错误,当in参数为1和3时,函数返回0.3333。
无论如何,谢谢你的时间和帮助!今天我至少提高了一点C语言技能。

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

因此,会自动对另一个整数操作数执行加宽强制转换

只是告诉您第二次显式转换是不必要的,因为它是由C自动完成的。因此,具有一次显式转换和两次显式转换的表达式是等价的

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

见:

C交互窗口中的快速测试:

> 1/3 0 >双1/3 0.33333333333333331 >1/3 0.33333333333333331 >双1/3 0.33333333333333331
这不是一个bug,它是CI中的一个规则,使用var result=doublefrom/to进行单元测试;而不是调用C++方法。考试通过了。我还调试并单步执行了它,并检查了结果。[DataRow1,3]对于具有两次转换的.NET变量,肯定会返回0.33331。如果是这样,为什么在第二次加宽转换显式化时会重新引入错误?这不是错误,而是提示您可以简化代码@JohanA我觉得很难相信,你能提供一个片段来重现这个问题,包括调用方代码吗?你可以将实际调用代码添加到你的问题中,或者使用dotnetfiddle.net之类的服务,例如@JohanA你调用函数时fromNoCarbonAtoms设置为0吗?