2013-11-22 6 views
5

Wenn die folgende Anweisung:Warum ist das falsch inline wenn?

return this.revision.HasValue ? this.revision : throw new InvalidOperationException(); 

ich dachte, es würde kompilieren wie der Wurf den normalen Fluss zu brechen und es sollte kein Problem sein, um keinen Wert zurück, aber es nicht bauen.

Gibt es eine Möglichkeit, diese Aussage zu korrigieren oder warum ist das nicht erlaubt?

Danke.

EDIT: this.revision ist int? und die Methode gibt int zurück.

EDIT 2: wenn ich diese Methode haben

public int Test() 
{ 
    throw new Exception(); 
} 

Der Compiler beschwert sich nicht über keinen Wert zurückkehrte, erwartete ich das gleiche von einem Inline-wenn ... zumindest wissen wir, dass können getan werden, wie es bereits in Methoden getan wird.

+2

Was ist der Rückgabetyp Ihrer Methode? – Christos

+4

Von msdn: Entweder muss der Typ von first_expression und second_expression gleich sein, oder eine implizite Konvertierung muss von einem Typ zum anderen existieren. http://msdn.microsoft.com/en-us/library/ty67wk28(v=vs.110).aspx – Ric

+1

liefern Sie Ihre (Visual Studio) Fehlermeldung. auf den ersten Blick, Revision! = Ausnahme. – mnemonic

Antwort

3

Ich nehme an, das Problem besteht in der Tatsache, dass this.revision ist ein Nullable-Typ und InvalidOperationException() ist eine SystemException. Sie können nicht zwei verschiedene Arten in ein, wenn Aussage wie:

return (a>b)? DateTime.Now : 2; 

Bitte schauen Sie hier: http://msdn.microsoft.com/en-us/library/vstudio/ty67wk28.aspx

Zustand? first_expression: zweiter_Ausdruck;

Die Bedingung muss als wahr oder falsch ausgewertet werden. Wenn die Bedingung wahr ist, wird first_expression ausgewertet und wird zum Ergebnis. Wenn die Bedingung falsch ist, wird second_expression ausgewertet und wird zum Ergebnis. Nur einer der beiden Ausdrücke wird ausgewertet.

Entweder muss der Typ von first_expression und second_expression derselbe sein, oder es muss eine implizite Konvertierung von einem Typ zum anderen vorhanden sein.

+0

Ich erwartete, dass der Compiler intelligent genug ist, um zu erkennen, dass in diesem Fall der Rückgabewert keine Rolle spielt ... –

+0

@SoMoS der ternäre Operator erfordert, dass die Typen gleich oder implizit konvertierbar sind http://msdn.microsoft.com/ en-us/library/ty67wk28% 28v = vs.110% 29.aspx – Gusdor

13

Konvertieren Kommentar zu einer Antwort:

Von MSDN:

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

?: Operator

Als int? nicht auf eine Ausnahme nicht umkehrt und throw ist kein Ausdruck, daher die Fehler im Code.

+0

Erneut erwartete ich, dass der Compiler schlau genug ist, um zu erkennen, dass in diesem Fall der Rückgabewert keine Rolle spielt ... Überprüfen Sie meine Eingabe –

+0

, aber es ist leicht anders als eine traditionelle if..else-Anweisung darin, dass die Typen übereinstimmen müssen oder für die Zuordnung konvertiert werden können. – Ric

+5

"Ich habe erwartet, dass der Computer seine Programmierung verletzt und meine Gedanken liest. Bitte helfen Sie, Internet." – Gusdor

2

Es ist, weil in einem ternary expression die letzten beiden Ausdrücke als ein Ersatz für einander fungieren und ihr Rückgabewert vom gleichen Typ sein oder implizit in Typ der zugewiesenen Variablen konvertiert werden muss.
Ein Exception hat eindeutig einen anderen Typ als int.

MSDN:

Wenn die Bedingung falsch ist, second_expression ausgewertet wird und wird das Ergebnis.

1

Dies ist, weil der zweite Operand ?: ein Ausdruck sein muss, nicht eine throw-Anweisung.

so, was Sie is-

public static T ThrowException<T>() 
{ 
    throw new Exception(); 
} 

und verwenden Sie es in Ihrer Erklärung

return this.revision.HasValue ? this.revision :ThrowException<bool>(); 
1

C# Compiler tun können, für das ermöglichen könnte, und es könnte viel mehr Dinge tun, als es heute der Fall ist. Das Problem besteht darin, dass das Feature geschrieben und dann unterstützt wird. Siehe Eric Gunnerson's blog post, in dem der Entscheidungsprozess für neue Funktionen erläutert wird.

+0

Bitte hinterlassen Sie den Kommentar, wenn Sie down-vote ... – ya23