Est-il possible en C # de surcharger un opérateur de casting générique de la manière suivante?
-
06-07-2019 - |
Question
Je me demandais s'il était possible de représenter le code suivant en C # 3.5:
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)
}
}
Merci
La solution
Les opérateurs de conversion ne peuvent pas être génériques. À partir de la section de spécification 10.10, voici le format d'un déclarant de conversion-opérateur:
conversion-operator-declarator: implicit operator type ( type identifier ) explicit operator type ( type identifier )
Comparez ceci avec, par exemple, un en-tête de méthode:
en-tête de méthode : attributs opt modificateurs de méthode opt partiel opt type de retour nom de membre liste de paramètres de type opt ( liste de paramètres formels opt ) clauses de type paramètre-paramètre opt
(Désolé pour le formatage, vous ne savez pas comment le faire mieux.)
Notez que le format de l'opérateur n'inclut pas de liste de paramètres de type ni de contraintes de paramètre de type.
Autres conseils
Votre code se résume à la ligne: return new Foo<U>((U)a.Item)
Où vous essayez d'affecter une classe de base à une classe héritée, ce qui est impossible.
Disons que T (classe de base) est de type Stream
et U est de type MemoryStream
(classe héritée), vous ne pouvez pas affecter de <=> à une variable de type <=>.
Je pense que la réponse courte est & "Impossible." Essayez d’utiliser une méthode à la place & Quot;
semble également être dupe de cette question Solution de contrainte d’opérateur surchargée dans les génériques .NET