2009-10-07 10 views
1

Quelle est la syntaxe à exiger T peut également être IComparable dans cette définition de classe?C#: question de syntaxe générique

public class EditItems<T> : Form 
+2

En règle générale, les génériques et le concepteur VS ne jouent généralement pas bien ensemble. –

+0

Malheureusement oui. (C'est mieux en VB puisque - contrairement à C# - le type générique est juste utilisé * après * il a été déclaré) – Dario

+0

@Dario Je ne sais pas comment c'est mieux en VB ... J'ai toujours eu de gros problèmes en utilisant des éléments d'interface utilisateur qui sont des génériques ouverts dans VB et C#. – Joseph

Répondre

7
public class EditItems<T> : Form where T : IComparable 
3

Utilisez une contrainte de type (voir MSDN):

public class EditItems<T> : Form where T : IComparable 
4
public class EditItems<T> : Form where T : IComparable 
3
public class EditItems<T> : Form where T : IComparable 
{...} 
11

Vous pouvez utiliser tout where T : IComparable comme indiqué par d'autres réponses. Je trouve qu'il est généralement plus utile de le contraindre avec:

public class EditItems<T> : Form where T : IComparable<T> 

Cela dit, il doit être un type qui est comparable à lui-même. D'une part, pour les types de valeur, cela évite la boxe. Pour un autre, cela signifie que vous êtes moins susceptible d'essayer de comparer deux valeurs qui ne sont pas réellement comparables.

+0

Non demandé mais toujours vrai ;-) – Dario

+0

La version générique est plus de type de sécurité, mais si vous voulez quelque chose qui ressemble à la contravariance l'implémentation IComparable vous ne pouvez utiliser la version non générique, jusqu'à ce que C# 4 sort – thecoop

+0

Je me demandais si quelqu'un pourrait attraper le IComparable ... Je l'ai effectivement choisi parce que ce serait une interface tout le monde le sait afin que je puisse me concentrer sur la question sur la syntaxe (je ne suis pas * vraiment * en utilisant IComparable). Merci pour la réponse complète bien! –