簡體   English   中英

是C#4.0元組協變

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM