假設我有一個不受約束的泛型方法,它支持所有支持相等的類型。它執行成對的相等性檢查等工作在爲O(n 2 ):如何有條件地調用帶約束的泛型方法?
public static int CountDuplicates<T>(IList<T> list)
{
/* ... */
}
我也有隻有具有類型支持排序工作的約束通用方法。它從Ø排序列表(N log n)的開始,然後計算所有副本中的一個通:
public static int CountDuplicatesFast<T>(IList<T> list)
where T : IComparable<T>
{
/* ... */
}
因此,主叫方可以選擇調用快速的方法,如果它是靜態已知的是,列表中的元素類型支持排序。可能發生的情況是,調用者自己使用通用的IList<T>
,其中T是無約束的,所以它是調用第一個(慢)方法的唯一選項。
現在,我想第一種方法在運行時檢查類型T
實際實現的接口IComparable<T>
如果是這樣,調用快速的方法:
public static int CountDuplicates<T>(IList<T> list)
{
if (typeof(IComparable<T>).IsAssignableFrom(typeof(T)))
{
return CountDuplicatesFast(list);
}
else
{
/* use the slow algorithm */
}
}
的問題是編譯器拒絕調用CountDuplicatesFast(list)
:
錯誤CS0314:類型 'T' 不能在通用類型或方法被用作類型參數 'T'「Program.CountDuplicatesFast <Ť>(System.Collections.Generic.IList <Ť>)'。沒有從'T'到'System.IComparable <T>'的裝箱轉換或類型參數轉換。
是否有可能說服編譯器相信我,我知道我在做什麼,並跳過約束檢查?
您是否嘗試過使用Cast? ()。ToList());' – Nevyn 2013-05-06 19:31:18
@Nevyn產生的類型'System.IComparable'不能用作泛型類型中的類型參數'T',或者不能用作類型'System.IComparable ' 'UserQuery.MyType.CountDuplicatesFast (System.Collections.Generic.IList )'。沒有從'System.IComparable '到'System.IComparable >'的隱式引用轉換。「 –
2013-05-06 19:36:40
有趣。幾乎是正確的軌道,但完全是錯誤的執行。我想我需要寫出一個測試程序並嘗試一些不同的東西。我認爲演員也許可以做到這一點......但我不知道該怎麼做......哦,第一次猜測它並不太遙遠:-) – Nevyn 2013-05-06 19:40:37