存在从 'float' 和 'float' 到 'float' 的隐式转换。

14

我最近收到的错误信息可能是最好的一条,我很想知道出了什么问题。

原始代码:

float currElbowAngle = LeftArm ? Elbow.transform.localRotation.eulerAngles.y 
                               : 360f - Elbow.transform.localRotation.eulerAngles.y

我正在使用Unity3d和C#; LeftArm是一个bool类型,并且根据文档Elbow.transform.localRotation.eulerAngles.y返回一个float值。

这段代码给我报错:

存在从“float”和“float”到“float”的隐式转换以及从“float”到“float”的转换

以下修复了此问题:

float currElbowAngle = LeftArm ? (float) Elbow.transform.localRotation.eulerAngles.y 
                               : 360f - Elbow.transform.localRotation.eulerAngles.y
所以我的问题是:那个错误想要表达什么,实际上出了什么问题?
更新1:Elbow是一个GameObject,在Visual Studio中出现了这个错误。

13
他们是否创建了自己的类型叫做“float”? - Servy
3
你使用的编译器是什么? - Hamlet Hakobyan
1
我在想编译器的解析逻辑是否可能在内部使用了两种不同类型的“float”。我不知道C#浮点数的确切规则,但它可能使用名称“float”同时指代只能是32位浮点数和可以使用更长类型的东西。例如,如果所有变量都是类型为“float”,那么使用8087式数学的系统可以最快地计算出f=x+y+z,即 f=(float)((FpuDouble)x+(FpuDouble)y+(FpuDouble)z) [FpuDouble指的是80位8087内部浮点类型,不可用于.net用户代码]。 - supercat
2
我认为错误信息想要表达的是,在条件运算符的:两侧有两种不同类型的表达式,并且隐式转换在两个方向上都可用,因此它无法选择一个“最佳”类型并决定进行哪种转换。通过添加显式转换,现在两侧都具有相同类型的类型,因此可以编译。但似乎您正在使用两种称为“float”的类型的环境中工作。很有趣。 - Damien_The_Unbeliever
1
哦,天啊,我好嫉妒啊。我所见过的最有趣的东西就是语法错误了…… - mirichan
显示剩余14条评论
1个回答

3
三目运算符(e?a:b)对于类型系统而言稍微有些棘手,因为两边需要返回相同的类型。如果出现微妙的 bug,我并不会感到惊讶。编译器偶尔让我们发笑还是很好的。

这样可能也可以解决问题:

float currElbowAngle = LeftArm ? 0.0f + Elbow.transform.localRotation.eulerAngles.y 
                               : 360f - Elbow.transform.localRotation.eulerAngles.y

我猜测问题在于你的真分支是左值,而假分支是右值。我的解决方法是将两个分支都变成右值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接