я просто совершенно неправильно контравариации?
Да. У вас есть полностью и совершенно неправильно понял, что означает «ковариация» и «контравариантность». Вы путали их с совместимостью назначения .
Это чрезвычайно распространенная ошибка. Эти два понятия связаны, но они совсем не то же самое.
Совместимость присвоений - это свойство, что выражение одного типа может быть сохранено в переменной другого типа.
Covariance - это свойство, что сопоставление типов от типов сохраняет совместимость присвоения направлений. Если Giraffe является присвоением, совместимым с Animal, и это означает, что IEnumerable<Giraffe>
является присвоением, совместимым с IEnumerable<Animal>
, тогда картирование IEnumerable<T>
составляет covariant.
Смотрите мою статью на эту тему для более подробной информации:
http://blogs.msdn.com/b/ericlippert/archive/2009/11/30/what-s-the-difference-between-covariance-and-assignment-compatibility.aspx
Установка А в точку Б, которая является ковариационной
Да это работает. «a» соответствует присвоение совместимости с B. Это не «ковариация», потому что ничего не меняется. Нет сопоставление типов от типов к типам, которое сохраняет направление совместимости присваивания, используемое в присваивании «a = B»; ничто не является общим.
, но установка b на новый A завершается с ошибкой компиляции.
Исправить.
Есть ли способ сделать это?
№ Вместо «А» и «В» назовите их «Животное и жираф». Каждый Жираф - это Животное, поэтому, если переменная может содержать Животное, тогда он может содержать Жираф. Если вы попытаетесь пойти другим путем, вы не можете поместить Animal в переменную типа Giraffe. Животное на самом деле может быть тигром. Почему вам должно быть позволено поставить Тигра в переменную типа Giraffe?
Спасибо за освобождение. Итак, допустим, B имеет в нем строковое название. Я хотел бы назначить всех членов от A до B, а затем назначить Title отдельно. Помимо явного назначения всех свойств по отдельности, есть ли ярлык? Это все, на чем я на самом деле. – DougJones
@ Doug - Возможно, AutoMapper? Также нет ничего странного в том, чтобы использовать сериализацию в одностороннем путешествии для изменения между одинаковыми моделями, но AutoMapper, вероятно, является вашим самым легким вариантом здесь. –
Отличный ... не слышал о проекте AutoMapper. Это помогает моей эффективности, но я думал о том, что неявный бросок будет работать и обеспечить эффективное выполнение. В любом случае, теперь я знаю ... еще раз спасибо. – DougJones