Почему C# не преобразует Container в Container неявно?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Почему C# не преобразует Container в Container неявно?

Сообщение Anonymous »

Рассмотрим следующий фрагмент кода:

Код: Выделить всё

class Animal {}
class Dog : Animal {}

interface MyContainer {
T Get(int i);
void Add (T thing);
}

class MyList : MyContainer {
private List items = new List();
public T Get(int i) { return items[i]; }
public void Add(T item) { items.Add(item); }
}

public static void Main(string[] args)
{
MyContainer dogs = new MyList();

// Why doesn't this cast dogs to animals?
MyContainer animals = dogs;
animals.Add(new Animal());
Animal retrievedAnimal = animals.Get(0);
animals.Add(new Dog());
}
Я знаю, что приведенный выше C# потерпит неудачу, потому что дженерики инвариантны. Я знаю, что строка MyContainer животные = собаки; не будет работать, потому что даже в ситуациях, когда вы можете ссылаться на MyList как на MyContainer (где контейнер является ковариантным), это по-прежнему MyList, и вводящая в заблуждение ссылка может побудить пользователей добавить Cat в MyList, поэтому в таком случае интерфейс не может содержать методы, принимающие T.
Мой вопрос: почему компилятор просто не приводит объект Dogs к MyContainer, когда ссылка измененный? Для меня это имеет логический смысл, и с этого момента ссылка соответствующим образом указывает на объект правильного типа, и мы можем свободно добавлять и удалять любые Animal из нашего контейнера. Кажется, что все проблемы с типами возникают, когда мы используем ссылку для ссылки на объект, который является подмножеством ссылочного типа, но не равен ему. Неужели компилятор не может сделать такой вывод неявно?

Подробнее здесь: https://stackoverflow.com/questions/792 ... implicitly
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Почему C# не преобразует Container в Container неявно?
    Anonymous » » в форуме C#
    0 Ответы
    29 Просмотры
    Последнее сообщение Anonymous
  • Почему C# не преобразует Container в Container неявно?
    Anonymous » » в форуме C#
    0 Ответы
    32 Просмотры
    Последнее сообщение Anonymous
  • Почему я не могу назначить List List?
    Anonymous » » в форуме C#
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Как я могу ссылаться на вектор с помощью span
    Anonymous » » в форуме C++
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Java неявно преобразует List в List с использованием дженериков
    Anonymous » » в форуме JAVA
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»