2015-01-09 38 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)。