Betrachten Sie eine Schnittstelle mit einem kovarianten Typ T
. Ich untersuche den Fall, in dem Eigenschaften in allen abgeleiteten Klassen dieser Schnittstelle, die T
verwenden, schreibgeschützt und kovariant sind, wenn es sich um eine generische Klasse handelt. Angenommen, diese Schnittstelle definiert dann eine Methode, die T
als Argumenttyp verwendet. Was für Verstöße erlaubt es?Welche Verstöße gibt es bei Verwendung eines kovarianten Typs in einer kontravarianten Position?
Betrachten wir zum Beispiel:
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
}
}
In C#, erhalte ich die Fehlermeldung:
Invalid variance: The type parameter 'T' must be contravariantly valid on 'ConsoleApplication.ICov.maybe_safe_set(T)'. 'T' is covariant.
was nicht verwunderlich ist, da T
in einer kontra Position gefunden wird. Ich kann mir jedoch keine Verletzung vorstellen, die hier auftreten kann.
Covariance bedeutet, dass der Typ nur von der Schnittstelle konsumiert wird und niemals an ihn übergeben wird. Stellen Sie sich das so vor, das 'out'-Schlüsselwort bedeutet, dass der Typ nur aus der Schnittstelle kommen sollte, aber Sie haben es als Argument der' maybe_safe_set'-Methode eingefügt. "T" kann stattdessen als kontravariant definiert werden. Die Schnittstelle ist ein Vertrag und sie weiß nicht, was eine bestimmte Implementierung tun könnte. – juharr
'öffentliche statische Klasse C {öffentlicher statischer T-Wert}' und 'public void may_safe_set (T v) {C .Value = v}' und '((ICov
Wenn das erlaubt wäre, könntest du eine 'ImpleConv 'nach' ICov