【问题标题】:Ambiguous extension method call between float and doublefloat 和 double 之间的模糊扩展方法调用
【发布时间】:2015-01-09 18:47:17
【问题描述】:

我有以下扩展方法,一种用于浮点数,一种用于双精度。

public static string ToTimeString(this float f, TimeStringAccuracy accuracyFlags = DefaultAccuracyFlags, TimeStringSeparator separator = DefaultSeparator)


public static string ToTimeString(this double d, TimeStringAccuracy accuracyFlags = DefaultAccuracyFlags, TimeStringSeparator separator = DefaultSeparator)

当我从 Visual Studio 单元测试中调用函数时,测试运行正确,并且调用没有歧义。当我从 Unity3D 代码中为浮点调用函数时(使用Mono),这两者之间的调用是模棱两可的。为什么编译器不知道它应该调用浮点扩展?可能是 Mono 造成的吗?

这是电话:

float i = 1f;
i.ToTimeString();

编译器错误:

Assets/Scipts/UIScripts/GameplayUIWindow.cs(61,48): error CS0121: The call is ambiguous between the following methods or properties: ToTimeString(this double, TimeStringAccuracy, TimeStringSeparator)' and `ToTimeString(this float, TimeStringAccuracy, TimeStringSeparator)'

【问题讨论】:

  • 看起来是 Mono 的问题,无法用 Visual Studio/windows 复制该问题。
  • 不同的编译器,不同的错误……但方法定义确实有些模棱两可。最好只提供一个,在需要其他数据类型的地方,只需将其转换到使用它的代码中即可。
  • 我赞同 Cocos 的想法,比较有道理。
  • @Habib 可能是因为 unity 使用的是旧版本的 mono
  • 我想我将删除浮动扩展名并使用该扩展名进行强制转换以在代码中加倍。目前,无论如何转换都是在扩展方法中完成的。该死的,我希望他们最终能更新 Mono :( 我不同意 LearnCocos2D,我认为最好为每种数字类型扩展以实现更清晰的代码。

标签: c# unity3d mono


【解决方案1】:

试试这个版本:

public static string ToTimeString<T>(this T target, TimeStringAccuracy accuracyFlags = DefaultAccuracyFlags, TimeStringSeparator separator = DefaultSeparator) where T : struct

它可以在 Mono 中编译成不同的代码,但仍然允许您以您想要的方式使用代码。作为免责声明,我建议对方法主体内的类型参数 T 进行一些类型检查,以确保该方法的行为方式符合您对预期类型(如 float 和 double)的预期,并为意外类型(如 int或枚举)。

【讨论】:

    猜你喜欢
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多