【问题标题】:There exists both implicit conversions from 'float' and 'float' and from 'float' to 'float'存在从“float”和“float”以及从“float”到“float”的隐式转换
【发布时间】: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


【解决方案1】:

三元 (e?a:b) 运算符对于类型系统来说稍微复杂一些,因为双方都需要给出相同的返回类型。如果那里有一个微妙的错误,我不会感到惊讶。编译器偶尔让我们发笑是件好事。

这可能也解决了它:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 2021-12-07
    • 1970-01-01
    相关资源
    最近更新 更多