2011-09-13 31 views
6

次のクラスには、M1が「すべてのコードパスが値を返すわけではない」とM2が不平を言うという2つの方法があります。一般的なC#question

質問:コンパイラは戻り値のコンテキストでM2をどのように解決しますか? (任意の内部コンパイル時の解像度がある場合)NotImplementedExceptionインスタンスが暗黙的にintとしてキャストされてどのように

class A 
     { 
      int M1() 
      { 
      } 
      int M2() 
      { 
       throw new NotImplementedException(); 
      } 
     } 
+0

一般Seesharp(敬礼) SWeko

+0

C#の仕様でこのプロセスがどこに記述されているのかわかりませんが、誰もそれを指摘できますか? – SWeko

+1

@SWeko:それを追跡しました。ここ:http://msdn.microsoft.com/en-us/library/aa664437(VS.71).aspx(最後の段落)。 – Jon

答えて

7

方法は、常に値を返すために必要とされません。特に、例外をスローすることで終了することもできます(この場合、値は返されません)。

編集:具体的には、intを返しthe rules for the body of a methodである:

  1. 方法のすべてreturnステートメントはメソッドブロックの端int
  2. に変換式を返す必要が
  3. 到達可能であってはなりません

この例では、コンパイラはM2が常にスローして終了することを証明できます、メソッドブロックの最後に到達できません(ルール#2を満たす)。 return文もありません。これもルール#1を満たしています。したがって、これは有効なメソッド定義です。

一方、M1はルール#2を満たしておらず、合法ではありません。

あなたはたぶんスローすることは言及していませんが、ほとんどの場合戻り値のメソッドはreturnを投げるのではなく、コンパイラが忘れてしまったと言います。

+0

私のWP7キーパッドでは高速です。 –

2

例外は、コードの流れに影響を与えます。スロー後のステートメントは実行されません。コンパイラはこれを証明して、メソッドのパスに満足しています。

例外の場合、intが返されません。通常の意味では何も返されません。代わりに例外が生成され、CLRはこれを別々に処理します。

http://msdn.microsoft.com/en-us/library/ms173160(v=vs.80).aspx

0

例外はint型にキャストされません。コンパイラは、それが常に到達する例外であるため、不平を言わないことを知っています。例外がヒットすると、スタックを例外処理ブロックまたはクラッシュに巻き戻します。 intは決してメソッド呼び出し元に返されません。

0

MSDNに述べたように、

throw文は、プログラム実行中に異常な状況(例外)の発生を通知するために使用されます。

(プログラマはロジックを処理し、エラーを指定しなかった場合)スローステートメントに実行コードの実行は、プログラムが停止され、例外メッセージがユーザーに表示され