Ist es in C # möglich, einen allgemeinen Cast-Operator in der folgenden Art und Weise zu überlasten?
-
06-07-2019 - |
Frage
Nur frage mich, ob es überhaupt ist den folgenden Code in C # 3.5 darstellen:
public struct Foo<T> {
public Foo(T item) {
this.Item = item;
}
public T Item { get; set; }
public static explicit operator Foo<U> ( Foo<T> a )
where U : T {
return new Foo<U>((U)a.Item)
}
}
Danke
Lösung
Conversion Operatoren können nicht generisch sein. Aus dem spec Abschnitt 10.10, hier ist das Format einer Umwandlung betreiber declarator:
conversion-operator-declarator: implicit operator type ( type identifier ) explicit operator type ( type identifier )
Man vergleiche dies mit, sagen wir, ein Verfahren-Header:
Methode-Header : Attribute opt Methode-Modifikatoren opt Teil opt return-type Mitglied-name Typ-Parameter-Liste opt ( formal-Parameter-Liste opt ) Typ-Parameter-Einschränkungsklauseln opt
(Sorry über die Formatierung -. Nicht sicher, wie es besser machen)
Beachten Sie, dass der Bediener Format keinen Typ Parameterliste oder Typ-Parameter Einschränkungen enthält.
Andere Tipps
Ihr Code läuft darauf hinaus, die Zeile: return new Foo<U>((U)a.Item)
Wenn Sie versuchen, eine Basisklasse zu einer vererbten Klasse zuweisen, was unmöglich ist.
Lassen Sie uns sagen, T (Basisklasse) vom Typ Stream
und U ist vom Typ MemoryStream
(geerbt Klasse), Sie können keine Stream
auf eine Variable vom Typ MemoryStream
zuweisen.
Ich denke, die kurze Antwort ist „nicht möglich. Versuchen Sie, ein Verfahren statt mit“
Auch scheint Betrogene dieser Frage zu sein Lösung für überladenen Operator Einschränkung in .NET Generika