Warum sind die nicht signierten CLR-Typen in C # so schwer zu verwenden?

8

Ich kam hauptsächlich aus dem C / C ++ - Hintergrund, bevor ich C # benutzte. Eines der Dinge, die ich mit meinem ersten Projekt in C # gemacht habe, war, einen solchen Kurs zu machen.

%Vor%

Ich war dann beschämt von der Tatsache, dass dies ein Casting erfordert:

%Vor%

wie

%Vor%

Warum haben die Sprachentwickler entschieden, die Ganzzahlarten mit und ohne Vorzeichen nicht implizit umsetzbar zu machen? Und warum werden die vorzeichenlosen Typen in der .Net-Bibliothek nicht mehr verwendet? Zum Beispiel kann String.Length niemals negativ sein, aber es ist eine vorzeichenbehaftete Ganzzahl.

    
Earlz 15.07.2010, 20:56
quelle

5 Antworten

18
  

Warum haben sich die Sprachdesigner dafür entschieden, die Ganzzahlarten mit und ohne Vorzeichen nicht zu verwenden?   implizit gießbar?

Weil das Daten verlieren oder irgendeine Ausnahme auslösen könnte, von denen es im Allgemeinen keine gute Sache ist, dies implizit zuzulassen. (Die implizite Konvertierung von Long zu Double kann zwar auch Daten verlieren, aber auf andere Weise.)

  

Und warum werden die vorzeichenlosen Typen in der .Net-Bibliothek nicht mehr verwendet?

Unsignierte Typen sind nicht CLS-kompatibel - nicht alle .NET-Sprachen haben sie immer unterstützt. Zum Beispiel hatte Visual Basic keine "native" Unterstützung für unsignierte Datentypen in .NET 1.0 und 1.1; Es wurde der Sprache für 2.0 hinzugefügt. (Sie könnten sie immer noch verwenden, aber sie waren nicht Teil der Sprache selbst - Sie könnten zum Beispiel nicht die normalen arithmetischen Operatoren verwenden.)

    
Jon Skeet 15.07.2010 20:58
quelle
4

Zusammen mit Jons Antwort, nur weil eine vorzeichenlose Zahl nicht negativ sein kann, heißt das nicht, dass sie nicht größer als eine signierte Zahl ist. uint ist 0 bis 4.294.967.295, aber int ist -2.147.483.648 bis 2.147.483.647. Viel Platz über dem Verlust von int .

    
Jess 15.07.2010 21:01
quelle
1

Weil eine vorzeichenlose Ganzzahl von 3B in eine vorzeichenbehaftete Ganzzahl implizit umgewandelt wird, wird sie explodieren.

Unsigned hat den doppelten Maximalwert von signed. Es ist der gleiche Grund, warum du nicht lange auf einen Int werfen kannst.

    
Mike M. 15.07.2010 21:01
quelle
1
  

Ich war dann beschämt von der Tatsache, dass dies ein Casting erfordert:

%Vor%

Aber Sie widersprechen sich hier. Wenn Sie wirklich (wirklich) Größe benötigen, um vorzeichenlos zu sein, als das Zuweisen von (vorzeichenbehaftet) x ist ein Fehler. Ein tiefer Fehler in deinem Code.

  

Zum Beispiel kann String.Length niemals negativ sein, aber es ist eine vorzeichenbehaftete Ganzzahl

Aber String.IndexOf kann eine negative Zahl zurückgeben, und es wäre peinlich, wenn die String.Length- und Index-Werte unterschiedliche Typen hätten.

Und während in der Theorie in einer unsignierten String.Length (4 GB Cap), wäre in der Praxis sogar die aktuellen 2GB groß genug (weil Strings dieser Länge selten und nicht ausführbar sowieso sind).

Die wirkliche Antwort ist also: Warum zuerst unsigniert?

    
Henk Holterman 15.07.2010 21:18
quelle
0

Bei der zweiten Zählung: weil sie wollten, dass die CLR mit Sprachen kompatibel ist, die keine unsignierten Datentypen haben (gelesen: VB.NET).

    
Seva Alekseyev 15.07.2010 21:05
quelle