2015-01-09 34 views
4

我有以下扩展方法,一个用于float,另一个用于double。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代码中调用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

看起来像Mono的问题,无法用Visual Studio/Windows复制问题。 – Habib 2015-01-09 18:50:26

+2

不同的编译器,不同的错误...但方法定义确实有点模棱两可。最好只提供一个,并且在需要其他数据类型的地方将其转换为使用它的代码。 – LearnCocos2D 2015-01-09 18:54:28

+0

我第二次科科斯的想法,它更有意义。 – FunctionR 2015-01-09 19:55:02

回答

0

试试这个版本来代替:

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

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