Probieren Sie den folgenden Code
aus %Vor% Glauben Sie, dass ConvertColorEnum()
eine Farbliste zurückgibt, d. h. List<Color>(){Color.Blue, Color.Red, Color.Green}
?
Ich habe das auf zwei Rechnern getestet, einen mit .net 3.5 (mscorlib Version 2.0.50727.1433), einen anderen mit .net 3.5 SP1 (mscorlib Version 2.0.50727.3082). Die Ergebnisse waren unterschiedlich - die .net 3.5 warf ein InvalidCastException
, weil die Ganzzahl nicht in enum konvertiert werden konnte, während .net 3.5 SP1 erfolgreich ausgeführt werden konnte, wobei die korrekten Ergebnisse zurückgegeben wurden.
Wer möchte das auf seiner Maschine ausprobieren und das Ergebnis melden oder erklären, warum das so ist?
Sie können über den Unterschied zwischen dem SP1 und der ursprünglichen Version des .net 3.5-Frameworks in der Versionshinweise .
Hier ist, was es für dieses spezielle Problem sagt:
In LINQ-Abfrageausdrücken über nicht-generische Sammlungen wie System.Collections.ArrayList, die von Klausel der Abfrage wird umgeschrieben der Compiler, um einen Aufruf an die Besetzung Betreiber. Darsteller konvertiert alle Elementtypen zum Typ spezifiziert in der from - Klausel in der Abfrage. Darüber hinaus im Original Release-Version von Visual C # 2008, der Der Cast-Operator führt auch einige aus Werttypkonvertierungen und benutzerdefinierte Konvertierungen. Jedoch, Diese Konvertierungen werden von Verwenden Sie stattdessen die System.Convert-Klasse der Standard-C # -Semantik. Diese Konvertierungen verursachen auch erhebliche Leistungsprobleme in bestimmten Szenarien. In Visual C # 2008 SP1 ist die Der Operator "Darsteller" wird zum Werfen geändert eine InvalidCastException für numerisch Wertetyp und benutzerdefiniert Konvertierungen. Diese Änderung wird eliminiert sowohl der Nicht-Standard-C # Cast Semantik und das Leistungsproblem. Diese Änderung wird in der folgendes Beispiel.
Sie können auch weitere Einzelheiten in dieser Blogpost .
Wenn Sie möchten, dass es funktioniert, verwenden Sie stattdessen Select
.
Was das warum ...?
Die Cast-Erweiterungsmethode verwendet einen Iterator, der bei der nächsten Bewegung die Ausgabe des ursprünglichen Enumerators in einer Objektvariable speichert (also nach Bedarf boxt) und dann versucht, diese in den Ergebnistyp umzuwandeln.
Werttypen in umrahmter Form reagieren nicht auf die Cast-Operation auf die gleiche Weise, als wenn sie entkoppelt wären (wo verschiedene automatische Konvertierungen möglich sind), stattdessen können sie nur in ihre ursprüngliche ungepackte Form umwandeln.
Ich würde mir vorstellen, dass die vorherige Implementierung der Cast-Erweiterung es entweder komplett anders machte oder eine spezielle Hülle für Enum-Typen hatte, um sie in eine integrale Form zu konvertieren (das ist schwierig, da Sie mit allen möglichen Formen umgehen müssen) >
Marc's Antwort auf die richtige Lösung ist völlig korrekt und ist aus den oben genannten Boxengründen tatsächlich effizienter als die Besetzung.
Tags und Links c#