float和double之间的不明确的扩展方法调用

时间:2015-01-09 18:47:17

标签: c# unity3d mono

我有以下扩展方法,一个用于float,一个用于double。

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)时,这两者之间的调用是不明确的。为什么编译器不知道它应该调用float扩展?可能是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)'

1 个答案:

答案 0 :(得分:0)

请尝试使用此版本:

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

它可以编译为Mono中的不同代码,但仍然允许您以您想要的方式使用代码。作为免责声明,我建议对方法体内的类型参数T进行一些类型检查,以保证方法的行为与预期类型(如float和double)的预期方式相同,并抛出异常类型的异常(如int)或者Enum)。