Unfähig (oder fähig) zu Listint.CastEnum ()?

8

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?

    
Graviton 14.05.2009, 13:05
quelle

3 Antworten

4

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 .

    
Jb Evain 14.05.2009, 13:35
quelle
17

Wenn Sie möchten, dass es funktioniert, verwenden Sie stattdessen Select .

%Vor%

Was das warum ...?

    
Marc Gravell 14.05.2009 13:07
quelle
4

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.

    
ShuggyCoUk 14.05.2009 13:19
quelle

Tags und Links