5

次のステートメントがある場合:

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

スローが通常の流れを壊しているのでコンパイルされると思っていましたが、値を返さなくても問題はありませんが、ビルドされません。

このステートメントを正しくする方法はありますか、またはなぜこれが許可されていないのですか?

ありがとう。

編集: this.revision は int ですか? メソッドは int を返します。

編集2:この方法がある場合

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

コンパイラーは値を返さないことについて不平を言いません。私はインラインの場合に同じことを期待していました...少なくとも、メソッドで既に行われているので、それができることを知っています。

4

5 に答える 5

13

コメントを回答に変換する:

MSDN から:

first_expression と second_expression の型が同じであるか、一方の型から他方の型への暗黙的な変換が存在する必要があります。

?: 演算子

asint?は例外に変換できず、 throw は式ではないため、コード内でエラーが発生します。

于 2013-11-22T10:44:34.837 に答える
3

問題は、this.revision が null 許容型であり、InvalidOperationException() が SystemException であるという事実にあると思います。次のような if ステートメントに 2 つの異なる型を含めることはできません。

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

こちらをご覧ください: http://msdn.microsoft.com/en-us/library/vstudio/ty67wk28.aspx

調子 ?first_expression : second_expression;

条件は true または false に評価される必要があります。condition が true の場合、first_expression が評価され、結果になります。condition が false の場合、second_expression が評価され、結果になります。2 つの式のうちの 1 つだけが評価されます。

first_expression と second_expression の型が同じであるか、一方の型から他方の型への暗黙的な変換が存在する必要があります。

于 2013-11-22T10:44:02.117 に答える
2

これは、三項式では、後者の 2 つの式が互いの代替として機能し、それらの戻り値が同じ型であるか、割り当てられる変数の型に暗黙的に変換可能である必要があるためです。
明らかに、Exceptionは とは異なるタイプですint

MSDN:

condition が false の場合、second_expression が評価され、 result になります。

于 2013-11-22T10:46:32.357 に答える
1

C# コンパイラはそれを可能にし、現在よりも多くのことを行うことができます。問題は、機能を作成してサポートするためのコストです。新機能の決定プロセスの概要については、Eric Gunnerson のブログ投稿を参照してください。

于 2013-11-22T11:01:53.050 に答える
1

これは、 の 2 番目のオペランドが?:throw ステートメントではなく式である必要があるためです。

だからあなたにできることは-

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

そしてあなたの声明でそれを使用してください

return this.revision.HasValue ? this.revision :ThrowException<bool>();
于 2013-11-22T10:49:37.130 に答える