Подтвердить что ты не робот

Почему Tuple <T1, T2, T3> не наследуется от Tuple <T1, T2>?

Так как доступны классы С# 4.0, Tuple. Почему Tuple с тремя элементами не является подклассом Tuple с двумя элементами?

Это может быть полезно при определении операции First : Tuple<T1,T2> -> T1, которая будет работать для любого кортежа, независимо от количества дополнительных элементов.

Кроме того, поскольку элементы кортежа доступны только для чтения, почему Tuple<T1,T2> не ковариант? (Например, a ITuple<Foo,Bar> является также ITuple<SuperFoo,SuperBar>)

4b9b3361

Ответ 1

Потому что это был бы очень плохой дизайн с неоправданно глубоким наследованием для больших длин. Единственное разумное наследование - это от какого-то генератора, но я не могу придумать код, который можно было бы использовать и использовать всеми n-кортежами. Neiter мог .NET дизайнеров.

Рекурсивное определение n-кортежа как (n-1) -кортека плюс один элемент является неестественным и, следовательно, громоздким, потому что в реальном наборе все элементы равны. Представьте, что у вас есть {1, 2, 3}. Существует два способа представления его в соответствии с вашим предложением: {{1, 2}, 3} и {1, {2, 3}}, ни один из которых не может быть разумно предпочтителен, что доказывает неправильное представление, потому что оно требует искусственных и лишних соглашений в дополнение к красивым и нерегулярным математическое определение.

Ответ 2

TL; DR Поскольку язык С# не является язык MATLAB, не Язык Wolfram, не Язык пролога не язык F #. Дизайн языка и дизайн библиотеки классов предназначены для обеспечения готовой, мощной и простой в работе с эффективным, полным Turing универсальным языком (см., Например, Википедия: С# Цели проектирования). С# не является языком для выражения и манипулирования идеями в их первоначальном философском или математическом смысле

Почему Tuple с 3 элементами не является подклассом Tuple с 2 элементами?

Почему кто-то из Microsoft решил написать http://referencesource.microsoft.com/#mscorlib/system/tuple.cs так, как он есть? Спросите дизайнеров в Microsoft.

Этот вопрос "почему" не имеет реального смысла жизни (и не соответствует формату вопроса). Если вы спросите "как", я могу жить с ним в своем коде и, например, как я могу определить GeneralTuple, который позволил бы мне создать некоторую абстрактную библиотеку обобщенных функций... тогда такой вопрос имел бы смысл и имел бы полезный ответ.

С моей точки зрения это дизайнерское решение, вероятно, было связано с природой и историей кортежей. Насколько я помню, это происходит из модели расчета Линды, где tuples, где базовая структура данных присутствует в Связанная память, известная как Tuplespace. Кортежи были просто простыми структурами данных (без объектов ООП с методами и поведением), подобно тому, что сегодня известно как Data Transfer Object (DTO). Это всегда была простая структура данных, часть ассоциативной памяти. Требуется простое и быстрое чтение/запись/передача. Именно так поддерживаются встроенные С# Tuples.

Почему Tuple<T1,T2> не ковариант (т.е. a Tuple<Foo,Bar> тоже Tuple<SuperFoo,SuperBar>)?

Потому что это не то, как работают общие классы. Этот вопрос несколько раз объяснялся также в отношении, см., Например, Ограничение общего унаследованного типа в С#