共変タイプT
のインターフェースを考えてみましょう。私はT
を使用するこのインターフェイスのすべての派生クラスのプロパティが読み取り専用であり、汎用クラスの場合は共変な場合を調べています。次に、このインタフェースが引数型としてT
を使用するメソッドを定義しているとします。どのような違反が許可されていますか?例えばここで反変的な位置にある共変型を使用すると、どのような違反が有効になりますか?
、考えてみます。
interface ICov<out T> {
void maybe_safe_set(T v);
}
class ImplCov<T> : ICov<T> {
public readonly T a;
public readonly IEnumerable<T> b;
public readonly IEnumerable<IEnumerable<T>> c;
// public readonly IList<T> d; // but not this
public void maybe_safe_set(T v) {
// do things that can't modify state: the type of our
// readonly, covariant IEnumerable members can't be modified
}
}
をC#では、私はエラーを取得する:
Invalid variance: The type parameter 'T' must be contravariantly valid on 'ConsoleApplication.ICov.maybe_safe_set(T)'. 'T' is covariant.
T
が反変な位置に発見されたことから、驚くべきことではないとします。しかし、ここで起こり得る違反は考えられません。
共分散は、型がインターフェイスからのみ消費され、渡されないことを意味します。このように考えると、 'out'キーワードは、型がインターフェースから出てくるだけで、' maybe_safe_set'メソッドの引数として入ります。代わりに、対立遺伝子変異体として定義されるべきである。インタフェースは契約であり、与えられた実装が何をするかはわかりません。 – juharr
'public static class C {public static T value}'と 'public void maybe_safe_set(T v){C .Value = v}'と '((ICov
'ImpleConv'を 'ICov