myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Basistechnologien und allgemeine .NET-Klassen » Warum können objects mit einem Werttypen, nicht in einen anderen Werttypen gecastet werden?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Warum können objects mit einem Werttypen, nicht in einen anderen Werttypen gecastet werden?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Scavanger Scavanger ist männlich
myCSharp.de-Mitglied

avatar-3209.jpg


Dabei seit: 13.03.2008
Beiträge: 309
Entwicklungsumgebung: MS VS C# 2010/2013 Prof.


Scavanger ist offline

Warum können objects mit einem Werttypen, nicht in einen anderen Werttypen gecastet werden?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Servus,

ich hab eine Verständnis frage:

Ursprünglich wollte ich folgendes machen:

C#-Code:
List<uint> l1 = new List<uint> { 1, 2, 3 };
var l2 = l1.Cast<int>().ToList();

Das wirft

Fehlermeldung:
System.InvalidCastException: "Unable to cast object of type 'System.UInt32' to type 'System.Int32'."

Nun ja, das lässt sich ja einfach mit

C#-Code:
var l2 = l1.Select(i => (int)i).ToList();

ersetzen, kein Problem.

Aber irgenwie hat mir das keine Ruhe gelassen, IEnumerable<T> Cast<T> ist folgendermaßen implementiert:

C#-Code:
public static IEnumerable<T> Cast<T>(this IEnumerable source)
{
    foreach (object o in source)
        yield return (T)o;
}

Das Problem ist, dass der Wert in ein object gesteckt wird, dieser Code wirft die gleiche Exception:

C#-Code:
uint i = 42;
object o = i;
int j = (int)o;

Erst dachte ich, Werttypen können nicht aus einem object zurück gecastet werden, aber folgerndes funktioniert:

C#-Code:
int i = 42;
object o = i;
int j = (int)o;

Warum können objects, mit einem Werttypen, nicht in einen anderen Werttypen gecastet werden? Vor allem da ja in der Exception die korrekten Typen genannt werden, also warum kann er den Cast nicht ausführen?
07.10.2020 21:20 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
MrSparkle MrSparkle ist männlich
myCSharp.de-Team

avatar-2159.gif


Dabei seit: 16.05.2006
Beiträge: 5.605
Herkunft: Leipzig


MrSparkle ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

07.10.2020 21:52 Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 14.516
Herkunft: BW


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Bei der "Umwandlung" von uint auf int handelt es sich im Endeffekt nicht um ein Cast sondern um ein Reassigment.
Hier brauchst Du die Convert.To-Methoden.

Zitat:
Das Problem ist, dass der Wert in ein object gesteckt wird, dieser Code wirft die gleiche Exception:

Die Exception selbst kommt im Prinzip vom Unboxing:
Deine Quelle ist uint; aber das Unboxing erfolgt auf int - daher knallts.

Bezogen auf Dein Beispiel bräuchtest Du einen zusätzlichen Cast; dann klappts.
=> uint -> object -> uint -> int

C#-Code:
uint i = 42;
object o = i;
int j = (int)(uint)o;

Aber => uint -> object -> int knallt.
Dass der "Cast" von unit auf int funktioniert liegt am expliziten Operator.

C#-Code:
public static implicit operator int(uint value) => Convert.ToInt32(value);

Dein Szenario deckt aber so Cast<T> nicht ab.
Cast ist eigentlich dafür da, dass Du zB. eine Collection eines Interfaces hast, das dann wiederum verschiedene Instanzen von Implementierungen hast, und dann durch das Cast die Implementierungen raus ziehen kannst.
07.10.2020 22:04 Beiträge des Benutzers | zu Buddylist hinzufügen
witte
myCSharp.de-Mitglied

Dabei seit: 03.09.2010
Beiträge: 936


witte ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Die Signatur sollte aber explicit sein, schließlich willst du ja ausdrücken dass nicht jedes uint in ein int umgewandelt werden kann und der Programmierer casten soll.
08.10.2020 12:06 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Scavanger Scavanger ist männlich
myCSharp.de-Mitglied

avatar-3209.jpg


Dabei seit: 13.03.2008
Beiträge: 309
Entwicklungsumgebung: MS VS C# 2010/2013 Prof.

Themenstarter Thema begonnen von Scavanger

Scavanger ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@MrSparkle:
Ich weiß, es mir nur klar zu machen um was es mir geht.

@Abt:
Super danke, an das Unboxing hab ich nicht gedacht. Daumen hoch
08.10.2020 17:20 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 3 Monate.
Der letzte Beitrag ist älter als 3 Monate.
Antwort erstellen


© Copyright 2003-2021 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 27.01.2021 11:40