Heim >Backend-Entwicklung >C++ >Warum scheitert der bedingte Bediener von C#(? :) Manchmal scheitert das implizite Typ?

Warum scheitert der bedingte Bediener von C#(? :) Manchmal scheitert das implizite Typ?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-24 13:47:09370Durchsuche

Implizite Typkonvertierungseinschränkungen des C#-Bedingungsoperators (?:)

Der Bedingungsoperator (?:) von C# bietet eine prägnante Syntax für bedingte Verzweigungen. Bei impliziten Typkonvertierungen zeigt es jedoch manchmal unerwartetes Verhalten.

Bedenken Sie den folgenden Codeausschnitt:

<code class="language-csharp">bool aBoolValue;
byte aByteValue;

// 这段代码可以成功编译
if (aBoolValue) 
    aByteValue = 1; 
else 
    aByteValue = 0;

// 这段代码编译失败,并出现错误:“无法将类型“int”隐式转换为“byte”。
aByteValue = aBoolValue ? 1 : 0;</code>

Warum wird das erste Code-Snippet kompiliert, das zweite Code-Snippet schlägt jedoch fehl?

Die Rolle der Typinferenz in C#

Wenn der Compiler Code analysiert, bestimmt er die Typen von Variablen und Ausdrücken basierend auf dem Kontext, in dem sie verwendet werden. Dieser Vorgang wird als Typinferenz bezeichnet. Typischerweise wird der Typrückschluss vom Ausdruck nach außen und nicht nach innen abgeleitet.

Im ersten Codeausschnitt leitet der Compiler den Typ von aByteValue basierend auf den Zuweisungen in jedem Zweig der if-else-Anweisung ab: aByteValue wird ein Wert von 1 oder 0 zugewiesen, die beide Bytes sind. Daher schließt der Compiler, dass aByteValue ein Byte ist.

Bedeutung des bedingten Ausdrucks

Der Bedingungsoperator wertet zwei Ausdrücke aus: den Ergebnisausdruck und den alternativen Ausdruck. Der Typ des bedingten Ausdrucks ist der allgemeinere Typ der beiden Ausdrücke.

Im zweiten Codeausschnitt werden sowohl der Ergebnisausdruck als auch der alternative Ausdruck zu Ganzzahlen (1 bzw. 0) ausgewertet. Daher schließt der Compiler, dass der bedingte Ausdruck vom Typ int ist.

In kompatiblen Typ konvertieren

Da der bedingte Ausdruck als int ausgewertet wird, kann er nicht implizit in ein Byte konvertiert werden. Um dieses Problem zu lösen, müssen Sie den Ausdruck explizit in Byte konvertieren, wie im folgenden Code gezeigt:

<code class="language-csharp">aByteValue = aBoolValue ? (byte)1 : (byte)0;</code>

Why Does C#'s Conditional Operator (?:) Sometimes Fail Implicit Type Casting?

Das obige ist der detaillierte Inhalt vonWarum scheitert der bedingte Bediener von C#(? :) Manchmal scheitert das implizite Typ?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn