Нет, это проблема ковариации. Если бы вы могли сделать:
Dictionary<int, A> dict = new Dictionary<int, B>();
Было бы возможно без ошибки компилятора поместить объект типа A в dict.
Проблема в том, что dict выглядит следующим образом: Dictionary<int, A>
, но на самом деле это тип Dictionary<int, B>()
(поэтому размещение объекта типа A приведет к ошибке времени выполнения из-за недопустимого приведения), поэтому вы не должны иметь права даже попытайтесь поместить объект типа A в dict, поэтому вы не можете сделать это:
Dictionary<int, A> dict = new Dictionary<int, B>();
Он защищает вас от ошибок во время выполнения.
Вы хотите проверить блог Эрика Липперта на эту тему: http://blogs.msdn.com/b/ericlippert/
Это одна из его любимых тем для обсуждения, так что она довольно тщательная.