TL; DR :(標題放棄它)我可以「在一次轉換中隱式刪除泛型參數從List<T>
」?隱式地從列表中刪除泛型參數<T>
一位朋友今天問我是否可以隱式地將List<T>
轉換爲非泛型封裝。
var list = new List<_some_type_>();
ObjectResult result = list;
的方法會是這個樣子:
public static implicit operator ObjectResult(List<T> list) { ... }
顯然,這裏的T
沒有定義,並且隱式操作的方法名是類型名稱,ERGO您不能包括通用參數方法名,除非該類型實際上是通用的,即:
class ObjectResult<T> { ... }
而不是
class ObjectResult { ... }
我們有一個用戶自定義轉換的約束(我錯過任何?):
- 無法轉換或從基類
- 無法轉換或從接口。
- 必須以兩種類型之一進行轉換。
是什麼讓List<T>
這麼難:
List<T>
唯一的推導來自Object
;因此,我們不得不直接從List<T>
List<T>
轉換隻有接口,再次,必須從List<T>
List<T>
直接,很明顯,在框架彙編起來,所以,它一定是從我們的包裝
我想到了一個2步驟的解決方案,其中有一箇中間人我們可以轉換(而唯一的中間人List<T>
是Object
,並且由於規則1,這不是一個選項)。
public class ObjectResult
{
public static implicit operator ObjectResult(WrapperBase arg) { ... }
}
public class WrapperBase { }
public class ObjectResultWrapper<T> : WrapperBase
{
public static implicit operator ObjectResultWrapper<T>(List<T> arg) { ... }
}
然後,調用代碼應該是這樣的:
var list = new List<int>();
ObjectResultWrapper<int> wrap = list;
ObjectResult result = wrap;
這並不能真正解決問題,這只是一個變通下降T
隱含(但在兩個步驟,沒有之一)。此時,使用輔助方法會更容易,並且不會使用用戶定義的轉換。
可能會有人反對隱含地放棄泛型參數的目的 - 我沒有任何其他解釋爲什麼他覺得這很重要。考慮這僅僅是一個學術問題。
這似乎是一個很奇怪的要求不能夠從任何界面轉換。 '列表'實現非通用IList,它不需要知道''。 –
我希望你指出語言的要求 - 我沒有把它做出來......只是澄清你的意見是針對語言,而不是我:) – payo
你能解釋一下你到底想幹什麼嗎? ObjectResult有什麼意義? – svick