Кортежи: возможные типы

В .NET кортежи - значимые типы, читал информацию про них в очередной книге, и обнаружил, что в прошлом коде, будучи совсем новичком, использовал в кортежах ссылочные переменные. И там всё работает. Как такое возможно? Это код для API, который обязан писаться в версии Framework 4.8. Может ранее в кортежи можно было помещать всё что угодно?

Для уточнения, возвращал из методов не просто ссылочные типы, но и даже списки ссылок. Что-то вроде этого:

public (List<SomeType>, List<List<SomeType2>>) Method() 
{    }

Почему код допустил использование в кортежах ссылочных типов?


Ответы (1 шт):

Автор решения: CrazyElf

У вас путаница между самим кортежем и его элементами:

  • Сам кортеж - значимый тип, т.е. он хранится сразу в памяти, в отличие от ссылочных типов, для которых сначала создаётся объект где-нибудь в куче, а потом берётся ссылка на этот объект, и уже эта ссылка отправляется куда-то. Поэтому кортежи используют, например, для возврата из функций - так работает быстрее, чем с объектами, которые сначала создаются, а потом из функции возвращается ссылка на объект. В случае кортежа из функции возвращается сразу сам кортеж.
  • Элементы кортежа могут быть любого типа. Хотите - значимого, хотите - ссылочного, ограничений нет.

P.S. Ссылка на официальную документацию. Цитата:

Tuple types are value types; tuple elements are public fields. That makes tuples mutable value types.

→ Ссылка