Когда мы определяем наши интерфейсы в C # 4.0, мы можем пометить каждый из общих параметров как in
или out
. Если мы попытаемся установить общий параметр как out и это приведет к проблеме, компилятор выдаст ошибку, не позволяя нам это сделать.
Вопрос:
Если у компилятора есть способы определить допустимые варианты использования как covariance
(out
), так и _5 _ (_ 6_), почему мы должны отмечать интерфейсы как таковые? Разве не было бы достаточно просто позволить нам определять интерфейсы, как мы всегда, и когда мы пытались использовать их в нашем клиентском коде, вызывать ошибку, если мы пытаемся использовать их небезопасным способом?
Пример:
interface MyInterface<out T> {
T abracadabra();
}
//works OK
interface MyInterface2<in T> {
T abracadabra();
}
//compiler raises an error.
//This makes me think that the compiler is cappable
//of understanding what situations might generate
//run-time problems and then prohibits them.
Кроме того,
разве это не то, что делает Java в той же ситуации? Насколько я помню, вы просто делаете что-то вроде
IMyInterface<? extends whatever> myInterface; //covariance
IMyInterface<? super whatever> myInterface2; //contravariance
Или я смешиваю?
Спасибо