在一個元組中,如果你有超過7個元素,你可以提供一個第8個元素,它是另一個元組並且定義多達7個元素,然後是另一個元組作爲第8個元素,並且在該行上。但是,編譯時對第8項沒有限制。例如,這是編譯器的合法代碼:爲什麼Tuple <T1... TRest>中的TRest不受約束?
var tuple = new Tuple<int, int, int, int, int, int, int, double>
(1, 1, 1, 1, 1, 1, 1, 1d);
即使智能感知文檔說TRest必須是Tuple。編寫或構建代碼時不會出現任何錯誤,它不會在運行時以ArgumentException的形式出現。
你可以大致在幾分鐘內實現一個元組,完成一個元組約束的第8項。我只是想知道爲什麼它離開了當前的實施?它可能是一個向前兼容性問題,他們可以在假設的C#5中添加更多元素?
短版的粗糙實施
interface IMyTuple { }
class MyTuple<T1> : IMyTuple
{
public T1 Item1 { get; private set; }
public MyTuple(T1 item1) { Item1 = item1; }
}
class MyTuple<T1, T2> : MyTuple<T1>
{
public T2 Item2 { get; private set; }
public MyTuple(T1 item1, T2 item2) : base(item1) { Item2 = item2; }
}
class MyTuple<T1, T2, TRest> : MyTuple<T1, T2> where TRest : IMyTuple
{
public TRest Rest { get; private set; }
public MyTuple(T1 item1, T2 item2, TRest rest)
: base(item1, item2)
{
Rest = rest;
}
}
...
var mytuple = new MyTuple<int, int, MyTuple<int>>
(1, 1, new MyTuple<int>(1)); // legal
var mytuple2 = new MyTuple<int, int, int>(1, 2, 3); // illegal at compile time
真的嗎?如何實現這一點,以便最後一個元素被限制爲任何大小的「Tuple」,而不需要定義在各種通用'Tuple'大小中通用的額外基類或接口?我不明白你認爲他們可以在C#中做到這一點。 – mquander 2010-06-08 01:04:42
@mquander,Tuple實現ITuple。您可以定義自己的Tuple(MyTuple)類型,將最後一項限制爲一個接口(IMyTuple),並且您將獲得編譯時檢查。 – 2010-06-08 01:08:38
哦,我不知道「ITuple」。感謝您的更正。我注意到'ITuple'是內部的;也許他們想保持內在 - 如果這是一個限制,它將不得不公開。 – mquander 2010-06-08 01:09:58