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!?
}
}
c#
compiler-errors
int
type-conversion
implicit-conversion
CodesInChaos
quelle
quelle
(short) i
.Antworten:
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 Konvertierungen verlustfrei sein sollten.
(Zitiert aus C # Language Specification Version 3.0)
quelle
Aufgrund der Möglichkeit der Kürzung erfolgt keine implizite Konvertierung von
int
nachshort
. Ein konstanter Ausdruck kann jedoch vom Compiler als vom Zieltyp behandelt werden .1
? Kein Problem: Es ist eindeutig ein gültigershort
Wert.i
? Nicht so sehr - es könnte zum Beispiel ein Wert seinshort.MaxValue
, und der Compiler kann dies im allgemeinen Fall nicht überprüfen.quelle
Expression<Func<int>>
? Dann können Sie übergeben() => 1
oder() => i
innerhalb der Funktion überprüfen, ob die übergebene Entität eine erfasste Variable oder einen konstanten Wert enthält.Ein
int
Literal kann implizit in konvertiert werdenshort
. Wohingegen:Die ersten beiden funktionieren also, weil die implizite Konvertierung von Literalen erlaubt ist.
quelle
Ich glaube, das liegt daran, dass Sie in den ersten beiden eine Literal / Konstante übergeben, aber es gibt keine automatische Typkonvertierung, wenn Sie in der dritten eine Ganzzahl übergeben.
Edit: Jemand hat mich geschlagen!
quelle
Weil es keine implizite Konvertierung zwischen nichtliteralem Typ und größerem Short gibt.
Eine implizite Konvertierung ist nur für konstante Ausdrücke möglich.
Wohin Sie
integer
Wert als Argument übergebenshort
quelle
Der Compiler hat gesagt , warum der Code fehlschlägt:
Hier ist die Frage, die Sie sich stellen sollten: Warum schlägt diese Konvertierung fehl? Ich googelte "c # convert int short" und landete auf der MS C # -Seite für das
short
Schlüsselwort:http://msdn.microsoft.com/en-us/library/ybs77ex4(v=vs.71).aspx
Wie auf dieser Seite angegeben, sind implizite Umwandlungen von einem größeren Datentyp
short
nur für Literale zulässig. Der Compiler kann erkennen, wann ein Literal außerhalb des Bereichs liegt, aber nicht anders. Daher muss sichergestellt werden, dass Sie einen Fehler außerhalb des Bereichs in Ihrer Programmlogik vermieden haben. Diese Bestätigung wird von einer Besetzung gegeben.quelle
Das Konvertieren von int -> short kann zum Abschneiden von Daten führen. Deshalb.
quelle