2017-02-13 6 views
1

ich folgenden Code haben:C# Operator? und werfen Ausnahme

public int Number(int x) 
{ 
    return x > 0 ? x : throw new Exception(); 
} 

Das Ziel ist sehr einfach, mit Operator '?' Ich möchte einen Wert überprüfen, wenn es die Bedingung erfüllt, den Wert zurückgeben, wenn nicht - einen Fehler werfen. aber VS Intellisense sagt: Ungültiger Ausdrucksterm throw; Muss ich andere Betreiber benutzen?

P.S. Ich denke, es ist das gleiche wie return throw new Exception(); Aber trotzdem sicher sein wollen. diese

+0

Ja, so funktioniert der Tertiär-Operator nicht. –

+2

Wenn ich mich nicht irre, wurde dies in C# 7 eingeführt. – ColinM

Antwort

7

schreiben statt:

public int Number(int x) 
{ 
    if(x <= 0) throw new Exception(); 
    return x; 
} 

Der Bedingungsoperator braucht eine gemeinsame Basistyp zurückgegeben werden, aber es gibt keine für int und Exception. Insbesondere werfen etwas ist nicht das gleiche wie zurückgeben etwas, auch wenn Ihre Methode würde zurück eine Exception (was ziemlich komisch war) wäre dies nicht möglich.

Von MSDN:

Entweder ist die Art von first_expression und second_expression müssen gleich sein, oder eine implizite Konvertierung von einem Typ zum anderen existieren.

-1

Mit? Ausdruck beide Seiten müssen denselben Typ zurückgeben, was in Ihrem Fall nicht zutrifft. Ersetzen mit if(x > 0) return x throw new Exception();

4

Sie können dies tun, in C# 7. Ihre Methode weiter zusammengezogen werden könnten:

public int Number(int x) => x > 0 ? x : throw new Exception(); 
1

Vor C# 7.0, wenn Sie eine Ausnahme von einem Ausdruck Körper werfen wollte man hätte to:

return x > 0 ? x : new Func<int>(() => { throw new Exception(); })(); 

In C wird das vereinfachte # 7.0 oben jetzt:

return x > 0 ? x : throw new Exception(); 
+0

Ist letzteres nur syntaktischer Zucker für den ersteren? – HimBromBeere