Почему делает C# (4.0) не, позволяют co - и контравариантность в универсальных типах классов?

Какова настоящая причина для того ограничения? Это, просто работают, который должен был быть сделан? Это концептуально трудно? Действительно ли это невозможно?

Несомненно, нельзя было использовать параметры типа в полях, потому что они всегда - чтение-запись. Но это не может быть ответом, не так ли?

Причина этого вопроса состоит в том, что я пишу статью о поддержке различия в C# 4, и я чувствую, что должен объяснить, почему это ограничивается делегатами и интерфейсами. Только к инверсии бремя доказывания.

Обновление: Eric спрашивают о примере.

Что относительно этого (не знают, имеет ли это смысл, уже :-))

public class Lookup where T : Animal {
  public T Find(string name) {
    Animal a = _cache.FindAnimalByName(name);
    return a as T;
  }
}

var findReptiles = new Lookup();
Lookup findAnimals = findReptiles;

Причиной того, чтобы иметь это в одном классе мог быть кэш, который сохранен в самом классе. И не называйте своих домашних животных другого типа тем же!

BTW, это приносит мне к дополнительным параметрам типа в C# 5.0 :-)

Обновление 2: я не требую CLR, и C# должен позволить это. Просто пытаясь понять, что вело, к которому это не делает.

22
задан Community 23 May 2017 в 12:25
поделиться

2 ответа

Во-первых, как говорит Томас, это не поддерживается в CLR.

Во-вторых, как это будет работать? Предположим, у вас есть

class C<out T>
{ ... how are you planning on using T in here? ... }

T может использоваться только в выходных позициях. Как вы заметили, в классе не может быть поля типа T, потому что это поле может быть записано. У класса не может быть никаких методов, которые принимают T, потому что они логически записываются. Предположим, у вас есть эта функция - как бы вы ею воспользовались?

Это было бы полезно для неизменяемых классов, если бы мы могли, скажем, сделать законным наличие поля типа T только для чтения; таким образом мы значительно сократим вероятность того, что это будет неправильно написано. Но довольно сложно придумать другие сценарии, допускающие вариацию безопасным для типов способом.

Если у вас есть такой сценарий, я бы хотел его увидеть. Это будет указывать на то, что когда-нибудь это будет реализовано в CLR.

ОБНОВЛЕНИЕ: См.

Почему нет универсальной дисперсии для классов в C # 4.0?

для получения дополнительной информации по этому вопросу.

20
ответ дан 29 November 2019 в 05:21
поделиться

Насколько мне известно, эта функция не поддерживается CLR, поэтому добавление этого потребует значительной работы и на стороне CLR. Я считаю, что ко- и контраверсия для интерфейсов и делегатов на самом деле поддерживалась в CLR до версии 4.0, так что это было относительно простое расширение для реализации.

(Хотя поддержка этой функции для классов была бы определенно полезной!)

8
ответ дан 29 November 2019 в 05:21
поделиться
Другие вопросы по тегам:

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