Ковариация и контравариантность - это понимание Принципа Наследования.
В обоих случаях ковариация и контравариантность, с. «передается», либо как возвращаемое значение, либо как аргумент метода делегата. То, что «проходит», должно быть «поймано» в сосуде. В C# - или программировании жаргона как такового - мы используем слово bucket для того, что я назвал емкостью. Иногда вам приходится возвращаться к другим словам, чтобы понять смысл обычно используемых слов жаргона.
В любом случае, если вы понимаете наследование, которое, скорее всего, будет читателем здесь, то единственное, на что нужно обратить внимание, это то, что сосуд, т.е. е. ведро, используемое для ловли, должно быть того же типа или менее производного типа, чем тот, который передается - это справедливо как для ковариации, так и для контравариантности.
Наследование говорит, что вы можете поймать птицу в ведерке животных, потому что птица - это животное. Поэтому, если параметр метода должен поймать птицу, вы можете поймать его в ведро животного (параметр типа животного), что тогда является контравариантностью. И если ваш метод, т. Е. Ваш делегат возвращает птицу, то «ведро» также может быть птицей типа или менее производным (родительского типа), то есть переменная, в которой вы улавливаете возвращаемое значение метода, должна быть тот же или менее производный тип, чем возвращаемое значение.
Просто переключите свое мышление, чтобы различать то, что передается, и то, что ловится, а затем вся сложность в отношении ковариации и контравариантности растворяется красиво. Тогда вы понимаете, что тот же принцип работает. Просто наследование не может быть нарушено, поскольку оно протекает только одним способом.
И компилятор настолько умен, что, когда вы бросаете ведро в более специализированный тип (опять же, и, если необходимо), тогда и только тогда вы получаете все специализированные методы, которые были добавлены в более производный класс. Это его красота. Так что это улов, бросок и использование того, что у вас есть, и, возможно, вам нужно.
Простое аллитерация всегда забавляет – Bob
Я постарался ответить на такие вопросы в короткой часто задаваемой статье: http://blogs.msdn.com/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx По-прежнему существует много путаницы в этой функции ... –