C #: Нет имплицитного преобразования из класса <Child>в класс <Base> - PullRequest
3 голосов
/ 11 июня 2009

Следующий фрагмент не будет компилироваться. Со следующей ошибкой:

Не удалось неявно преобразовать тип 'Container ' в 'Container '

class BaseClass {}
class ChildClass : BaseClass {}
class Container<T> where T : BaseClass {}
class Program {
    static void Main() {
        // why doesn't this work?
        Container<BaseClass> obj = new Container<ChildClass>(); 
    }
}

Это задумано? Если это так, то в чем причина?

Ответы [ 4 ]

14 голосов
/ 11 июня 2009

(сделано вики, на случай дупс)

C # (3.0) не поддерживает ковариацию списков и т. Д. C # 4.0 будет поддерживать ограниченную [co | contra] дисперсию, но все еще не списки .

Проблема в том, что с:

Container<BaseClass> obj = new Container<ChildClass>(); 

Я мог бы сделать:

obj.Add(new SomeOtherSubclass()); // SomeOtherSubclass : BaseClass

который компилируется, но не работает.

Такое поведение поддерживается для массивов, но в основном по историческим причинам.

4 голосов
/ 11 июня 2009

Yo,

Если вам нужна убийственная статья о ковариации / контравариантности на C #, загляните в блог Эрика Липперта "Сказочные приключения в кодировании". Во-первых, это название моего блога фаворитов, а второй Эрик написал лучшую последовательность статей о (со | контра) дисперсии:

http://blogs.msdn.com/ericlippert/archive/2007/10/16/covariance-and-contravariance-in-c-part-one.aspx

Это так же хорошо, как Плохо .

2 голосов
/ 11 июня 2009

Это то, что известно как ковариация / контравариантность, которая недоступна в C # 3.0. Это будет несколько доступно в C # 4.0. Вот некоторая информация:

http://reddevnews.com/articles/2009/05/01/generic-covariance-and-contravariance-in-c-40.aspx

0 голосов
/ 11 июня 2009

Невозможно неявно преобразовать тип Container<ChildClass> в Container<BaseClass>

Существует очень распространенное заблуждение, которое MyClass<Child> наследует от MyClass<Base>.

...