Je voulais juste savoir pourquoi des classes scellées ne sont pas autorisées à être des contraintes de type générique?
Supposons que j'ai un simple extrait de code en C # comme ci-dessous P>
public sealed class Base
{
public Base() { }
}
public class Derived<T>
where T : Base
{
public Derived() { }
}
4 Réponses :
car alors il n'y a pas de point en étant générique. Pourquoi voulez-vous veux em> t code> pourrait seul em> Be base code>, afin que vous puissiez aussi bien en faire un type non générique pour commencer. P>
dérivé code> pour être générique ici? Pourquoi voudriez-vous veux em> un type appelé base code> (impliquant qu'il devrait s'agir d'un type de base) à sceller? P>
Je suppose que c'est qu'il génère du code. Ce n'est pas comme si le générateur de code va savoir que quelqu'un a frappé un scellé code> sur la classe.
Et bien sûr par une logique similaire, vous ne pouvez pas utiliser "objet" comme contrainte, pour la raison opposée; T va déjà être convertible en objet car seuls les types convertibles à l'objet peuvent être utilisés comme arguments de type, de sorte que la contrainte serait redondante.
@ERIFLIPPERT Même s'il n'a pas d'avantage fonctionnel. Il dispose d'une prestation de maintenance car vous pouvez beaucoup plus facilement échanger un type de contrainte générique que de remplacer toutes les instances de la classe scellée dans un nouveau type. Peu importe un petit avantage, je ne vois pas pourquoi on appliquerait un type générique non scellé.
Parce que t n'aura jamais de cours d'enfant! Il ne sert à rien d'avoir un tel type de générique. p>
En fait, t pourrait avoir des cours d'enfant si cela était débouché plus tard. Bien que si cela se produisait, le code existant continuerait de travailler comme écrit, cette situation n'est donc pas une question.
t code> ne peut pas être autre chose que base code>. Alors, quel est le point qui le rend générique? P>
Le compilateur ne veut pas traverser la peine de faire quelque chose de générique s'il n'y a qu'un seul cours possible. Notez que l'on peut utiliser une classe scellée comme contrainte générique si la classe scellée est transmise sous forme de paramètre de type. Par exemple, si on a une classe
Class Foo(Of T, U As T)