В кортеже, если у вас более 7 предметов, вы можете предоставить восьмой предмет, который является еще одним кортежем и определить до 7 предметов, а затем еще один кортеж как восьмой, включающий и выключающий линию.Тем не менее, нет никаких ограничений на 8-й элемент во время компиляции.Например, это допустимый код для компилятора:
var tuple = new Tuple<int, int, int, int, int, int, int, double>
(1, 1, 1, 1, 1, 1, 1, 1d);
Несмотря на то, что в документации по Intellisense сказано, что 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