J'ai pensé qu'il était étrange que C# me laisse appeler trier sur ma classe et ne spécifie pas un moyen de les trier ni d'écrire une surcharge de comparaison. Quand je courais ce code cette erreur apparaissaitPourquoi C# permet-il de compiler le code de tri quand il ne sait pas comment trier
List<MyClass> myClassArray= new List<MyClass>();
//myClassArray.add(...);
myClassArray.Sort();
An unhandled exception of type 'System.InvalidOperationException' occurred in mscorlib.dll
Additional information: Failed to compare two elements in the array.
Pourquoi C# me laisse compiler ce code quand il ne marche pas savoir comment régler ce problème! -modifier
Le Codex demande pourquoi il fait ceci. J'ai écrit une théorie sur pourquoi il le fait dans mes commentaires. Voici un exemple de code.
class A : IComparable<A>
{
public int CompareTo(A a) { return 0; }
}
class C //: IComparable<A>
{
public int CompareTo(A a) { return 0; }
}
static void test()
{
A a = new A();
bool b;
C c = new C();
object o = a;
IComparable<A> ia = (IComparable<A>)o;
b = ia == ia;
o = c;
IComparable<A> ic = (IComparable<A>)o;
b = ic == ic;
//uncomment this to get a compile time error
//IComparable<A> ic2 = c;
return;
}
Si vous décommentez la ligne avant le retour, vous obtiendrez une erreur de compilation. Lorsque vous décommentez IComparable dans la classe c, il compilera et travaillera.
BTW solution de tri ajoute: IComparable à votre définition de classe et définissant la fonction int CompareTo (T). –
@ acidzombie24: Je suis d'accord avec la question "Je ne comprends pas comment ça se compile?" Je n'ai pas trouvé de réponse convaincante. Pourriez-vous s'il vous plaît partager le vôtre? – Codex
Codex: Jugement par jeffamaphone et Marc Gravell répondre à la seule conclusion que j'ai trouvé était C# garde la trace du type de toutes les vars pendant l'exécution (c'est pourquoi l'objet fonctionne?) Avec le nom et la signature de la méthode. En raison de la disponibilité des types au moment de l'exécution, je suppose qu'ils essaient de le typecasting à –