В Кортеже, если у Вас есть больше чем 7 объектов, можно обеспечить 8-й объект, который является другим кортежем, и определите до 7 объектов и затем другой кортеж как 8-е и вперед и вперед по линии. Однако нет никакого ограничения на 8-й объект во время компиляции. Например, это - свод законов для компилятора:
var tuple = new Tuple<int, int, int, int, int, int, int, double>
(1, 1, 1, 1, 1, 1, 1, 1d);
Даже при том, что в intellisense документации говорится, что Трестом должен быть Кортеж. Вы не получаете ошибки при записи или создании кода, она не проявляет до времени выполнения в форме 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
Гипотетическое ограничение ITuple
на самом деле не ограничивает его кортежем [1], не так ли? Просто класс, реализующий ITuple
.
[1] - Я определяю "кортеж" как один из классов Tuple <>
, предоставляемых BCL.
Это ограничение системы типов. ITuple
- это внутренний интерфейс. Если бы это было общее ограничение, оно должно было бы быть общедоступным, что позволило бы каждому реализовать свой собственный ITuple
, который не мог бы иметь ничего общего с кортежами. Ограничение его внутренним позволяет команде BCL гарантировать, что это действительно какой-то кортеж, но приводит к тому, что TRest
будет немного менее безопасным при компиляции, чем мог бы быть.