[英]Is C# 4.0 Tuple covariant
(我會親自檢查一下,但是我還沒有VS2010)
假設我有2個基本接口:
IBaseModelInterface
IBaseViewInterface
還有兩個實現這些目的的接口:
ISubModelInterface : IBaseModelInterface
ISubViewInterface : IBaseViewInterface
如果我定義Tuple<IBaseModelInterface, IBaseViewInterface>
我想根據工廠返回Tuple<ISubModelInterface, ISubViewInterface>
的結果進行設置。
在C#3中,即使子接口實現了基本接口,我也無法做到這一點。 而且我非常確定,如果我使用的是IEnumerable<IBaseModelInterface>
C#4允許我執行此操作,因為現在已使用in
關鍵字定義了該變量以允許協方差。 那Tuple
允許我這樣做嗎?
從我了解的一點(一點)來看,協方差僅在接口上被允許,是否意味着需要有一個ITuple<T1, T2>
接口? 是否存在?
Tuple
是一個類(嗯,一類類)-根據定義,它是不變的。 如您稍后所述,.NET 4中僅接口和委托類型支持通用差異。
我知道沒有ITuple
界面。 由於元組是不可變的,因此可能會有協變,因此您只能從API之外獲取值。
您可以從元組繼承來創建自己的協變元組。 這樣,您就不必重寫自己的相等邏輯。
public interface ICovariantTuple<out T1>
{
T1 Item1 { get; }
}
public class CovariantTuple<T1> : Tuple<T1>, ICovariantTuple<T1>
{
public CovariantTuple(T1 item1) : base(item1) { }
}
public interface ICovariantTuple<out T1, out T2>
{
T1 Item1 { get; }
T2 Item2 { get; }
}
public class CovariantTuple<T1, T2> : Tuple<T1, T2>, ICovariantTuple<T1, T2>
{
public CovariantTuple(T1 item1, T2 item2) : base(item1, item2) { }
}
etc.... for 3, 4, 5, 6, 7, 8 items
編譯失敗
Tuple<Exception> item = new Tuple<ArgumentNullException>(null);
編譯成功
ICovariantTuple<Exception> item = new CovariantTuple<ArgumentNullException>(null);
8個項目之后沒有基本的Tuple ,但是應該足夠了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.