В чем разница между <out T>и <T>? Например: public interface IExample<out T> { ... } против public interface IExample<T> { ... }
Ковариантность, контравариантность и инвариантность описывают, как существующая иерархия наследования типов изменяется при некотором преобразовании (например, использовании в дженериках). Если преобразование сохраняет порядок исходной иерархии, оно является «ковариантным». Если он переворачивает его, это «контравариантно». Если он его нарушает, он «инвариантен».
В чем разница между <out T>и <T>? Например: public interface IExample<out T> { ... } против public interface IExample<T> { ... }
Хотя мы можем наследовать от базового класса / интерфейса, почему мы не можем объявить List<> использование одного и того же класса / интерфейса? interface A { } class B : A { } class C : B { } class Test { static void Main(string[] args) { A a = new C(); // OK List<A> listOfA = new...
У меня небольшие проблемы с пониманием того, как я буду использовать ковариацию и контравариантность в реальном мире. До сих пор я видел только один и тот же старый пример массива. object[] objectArray = new string[] { "string 1", "string 2" }; Было бы неплохо увидеть пример, который позволил бы...
От эффективной Явы Джошуа Блох, Массивы отличаются от универсального типа двумя важными способами. Первые массивы ковариантны. Обобщения являются инвариантами. Ковариант просто означает, что если X является подтипом Y, то X [] также будет подтипом Y []. Массивы являются ковариантными, так как...
IEnumerable<T>является ко-вариантом, но не поддерживает тип значения, только ссылочный тип. Приведенный ниже простой код успешно скомпилирован: IEnumerable<string> strList = new List<string>(); IEnumerable<object> objList = strList; Но переход от stringк intполучит...
На этот вопрос есть ответы на переполнение стека на русском языке : Ковариантность и контрвариантность обобщены У меня проблемы с пониманием разницы между ковариацией и контравариантностью....
Исходя из этого вопроса , может кто-нибудь объяснить в Scala следующее: class Slot[+T] (var some: T) { // DOES NOT COMPILE // "COVARIANT parameter in CONTRAVARIANT position" } Я понимаю различие между +Tи Tв объявлении типа (оно компилируется, если я использую T). Но тогда как на самом деле...
У меня есть private readonlyсписок LinkLabels ( IList<LinkLabel>). Позже я добавляю LinkLabels в этот список и добавляю эти метки к FlowLayoutPanelследующему: foreach(var s in strings) { _list.Add(new LinkLabel{Text=s}); } flPanel.Controls.AddRange(_list.ToArray()); ReSharper показывает мне...
Я не могу понять, почему следующий код C # не компилируется. Как видите, у меня есть статический универсальный метод Something с IEnumerable<T>параметром (и Tон должен быть IAинтерфейсом), и этот параметр не может быть неявно преобразован в IEnumerable<IA>. Какое объяснение? (Я не ищу...
Сегодня я прочитал несколько статей о ковариантности, контравариантности (и инвариантности) в Java. Я читал статьи в Википедии на английском и немецком языках, а также некоторые другие сообщения в блогах и статьи IBM. Но я все еще немного не понимаю, о чем они? Некоторые говорят, что это связано с...
Я не был на PDC 2008, но услышал новости о том, что C # 4.0 объявлен для поддержки универсальной ковариантности и контр-дисперсии. То есть List<string>можно назначить List<object>. Как такое могло быть? В книге Джона Скита « C # in Depth» объясняется, почему универсальные шаблоны C # не...
Что такое ковариантный тип возвращаемого значения в Java? В объектно-ориентированном программировании
Закрыто . Этот вопрос должен быть более конкретным . В настоящее время он не принимает ответы. Хотите улучшить этот вопрос? Обновите вопрос, чтобы он фокусировался только на одной проблеме, отредактировав этот пост . Закрыт 5 лет назад . Уточните этот вопрос Пожалуйста, покажите хороший пример...
РЕДАКТИРОВАТЬ : переписал этот вопрос на основе исходного ответа scala.collection.immutable.SetКласс не ковариантен в параметре типа. Почему это? import scala.collection.immutable._ def foo(s: Set[CharSequence]): Unit = { println(s) } def bar(): Unit = { val s: Set[String] = Set("Hello", "World");...
Я работаю с .NET framework, и я действительно хочу иметь возможность создавать страницы нестандартного типа, которые использует весь мой веб-сайт. Проблема возникает, когда я пытаюсь получить доступ к странице из элемента управления. Я хочу иметь возможность возвращать мой конкретный тип страницы...
Я встречал их в учебнике по C #, который я читаю, но мне трудно их понять, вероятно, из-за отсутствия контекста. Есть ли хорошее краткое объяснение того, что они из себя представляют и для чего они полезны? Отредактируйте для пояснения: Ковариантный интерфейс: interface IBibble<out T> . ....
Кажется, что объект List не может быть сохранен в переменной List в C # и даже не может быть явно приведен таким образом. List<string> sl = new List<string>(); List<object> ol; ol = sl; приводит к невозможности неявно преобразовать тип...
Это правильно компилируется в C # 7.3 (Framework 4.8): (string, string) s = ("a", "b"); (object, string) o = s; Я знаю, что это синтаксический сахар для следующего, который также правильно компилируется: ValueTuple<string, string> s = new ValueTuple<string, string>("a", "b");...