【发布时间】:2013-01-16 18:07:25
【问题描述】:
这可能是我一段时间以来收到的最好的错误消息,我很好奇出了什么问题。
原代码
float currElbowAngle = LeftArm ? Elbow.transform.localRotation.eulerAngles.y
: 360f - Elbow.transform.localRotation.eulerAngles.y
我正在使用 Unity3d 和 C#; LeftArm 是一个bool 类型,根据documentation Elbow.transform.localRotation.eulerAngles.y 返回一个float 值。
这段代码给了我错误:
同时存在从 'float' 和 'float' 的隐式转换和 从“浮动”到“浮动”
这解决了它:
float currElbowAngle = LeftArm ? (float) Elbow.transform.localRotation.eulerAngles.y
: 360f - Elbow.transform.localRotation.eulerAngles.y
所以我的问题是:试图沟通的错误是什么,实际出了什么问题?
更新 1:肘部是 GameObject,此错误出现在 Visual Studio 中
【问题讨论】:
-
他们是否创建了自己的名为
float的类型? -
你用的是什么编译器?
-
我想知道编译器的解析逻辑是否可能在内部使用了两种不同的“float”。我不知道 C# 对浮点的确切规则是什么,但它可能会使用名称
float来指代只能是 32 位浮点数的事物以及在方便时可以使用更长类型的事物。例如,如果所有变量都是float类型,则使用 8087 风格数学的系统可以最快地将f=x+y+z评估为f=(float)((FpuDouble)x+(FpuDouble)y+(FpuDouble)z)) [FpuDouble指的是 80 位 8087 内部浮点类型不适用于 .网络用户代码]。 -
我认为错误试图传达的是它在条件运算符中的
:的任一侧都有两种不同类型的表达式,并且在两个方向上都可以使用隐式转换 - 所以它是无法选择单一的“最佳”类型并决定进行哪种转换。通过添加您的显式转换,它现在可以看到双方具有相同类型的类型,因此它可以编译。但您似乎确实在一个具有两种类型的环境中工作,称为float。有趣。 -
天哪,我嫉妒了。我见过的最有趣的是语法错误......
标签: c# compiler-errors unity3d