C#4.0でインターフェイスを定義する場合、各ジェネリックパラメーターをin
またはとしてマークすることができますout
。ジェネリックパラメーターをoutとして設定しようとして問題が発生した場合、コンパイラーはエラーを発生させ、それを許可しません。
質問:
covariance
コンパイラに(out
)とcontravariance
( )の両方の有効な使用法を推測する方法がある場合in
、なぜインターフェイスをそのようにマークする必要があるのでしょうか。いつものようにインターフェイスを定義するだけで十分ではないでしょうか。クライアントコードでインターフェイスを使用しようとしたときに、安全でない方法で使用しようとするとエラーが発生します。
例:
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
それとも私は物事を混ぜていますか?
ありがとう