Почему Трест в Кортеже <трест T1 …>, не ограниченный?

В Кортеже, если у Вас есть больше чем 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
5
задан Anthony Pegram 8 July 2010 в 18:19
поделиться

2 ответа

Гипотетическое ограничение ITuple на самом деле не ограничивает его кортежем [1], не так ли? Просто класс, реализующий ITuple .

[1] - Я определяю "кортеж" как один из классов Tuple <> , предоставляемых BCL.

1
ответ дан 14 December 2019 в 04:30
поделиться

Это ограничение системы типов. ITuple - это внутренний интерфейс. Если бы это было общее ограничение, оно должно было бы быть общедоступным, что позволило бы каждому реализовать свой собственный ITuple, который не мог бы иметь ничего общего с кортежами. Ограничение его внутренним позволяет команде BCL гарантировать, что это действительно какой-то кортеж, но приводит к тому, что TRest будет немного менее безопасным при компиляции, чем мог бы быть.

7
ответ дан 14 December 2019 в 04:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: