Warum funktioniert das erste und zweite Schreiben, aber nicht das letzte? Gibt es eine Möglichkeit, alle 3 zuzulassen und festzustellen, ob es 1, (int) 1 war oder ich übergeben habe? Und warum darf man nur den letzten? Das zweite erlaubt, aber nicht das letzte, hat mich wirklich umgehauen.
Demo zur Anzeige eines Kompilierungsfehlers
using System;
class Program
{
public static void Write(short v) { }
static void Main(string[] args)
{
Write(1);//ok
Write((int)1);//ok
int i=1;
Write(i);//error!?
}
}
Die ersten beiden sind konstante Ausdrücke, der letzte nicht.
Die C # -Spezifikation ermöglicht eine implizite Konvertierung von int nach short für Konstanten, jedoch nicht für andere Ausdrücke. Dies ist eine vernünftige Regel, da der Compiler für Konstanten sicherstellen kann, dass der Wert in den Zieltyp passt, für normale Ausdrücke jedoch nicht.
Diese Regel steht im Einklang mit der Richtlinie, dass implizite Conversions verlustfrei sein sollten.
6.1.8 Implizite Konvertierungen konstanter Ausdrücke
Eine implizite Konvertierung konstanter Ausdrücke ermöglicht die folgenden Konvertierungen:
- Ein konstanter Ausdruck (§7.18) vom Typ
int
Typ umgewandelt werden kannsbyte
,byte
,short
,ushort
,uint
, oderulong
, sofern der Wert des konstanten Ausdrucks innerhalb des Bereichs des Zieltypen.- Ein konstanter Ausdruck vom Typ
long
kann in Typ konvertiert werdenulong
, vorausgesetzt, der Wert des konstanten Ausdrucks ist nicht negativ.
(Zitiert aus C # Language Specification Version 3.0)
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen