7
votes

Pourquoi les classes scellées ne sont pas autorisées à être des contraintes de type générique?

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() { }
}


0 commentaires

4 Réponses :


11
votes

car alors il n'y a pas de point en étant générique. t pourrait seul Be base , afin que vous puissiez aussi bien en faire un type non générique pour commencer.

Pourquoi voulez-vous veux dérivé pour être générique ici? Pourquoi voudriez-vous veux un type appelé base (impliquant qu'il devrait s'agir d'un type de base) à sceller?


3 commentaires

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é 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é.



2
votes

Parce que t n'aura jamais de cours d'enfant! Il ne sert à rien d'avoir un tel type de générique.


1 commentaires

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.



0
votes

t ne peut pas être autre chose que base . Alors, quel est le point qui le rend générique?


0 commentaires

1
votes

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)


0 commentaires