ここで用語を明確にする価値があります。sc
オブジェクトではなく、変数です。変数の値は参照です。参照はnullの場合もあれば、実際のオブジェクトへの参照の場合もあります。
さて、なぜそれが思ったほど単純ではないのかについては...
このコードでは:
sc.SomeMethod();
...2つの操作があります。
sc
の値を実行スタックにロードします
- 実行
SomeMethod
スタック上の参照を介して実行する
失敗するのは2番目の操作であり、その操作は実際には最初の操作を「認識」していません。
より多くの操作が含まれると、さらに悪化します。どうですか:
Foo().Bar().SomeMethod()
この場合、例外が表示されると思いますか?
個人的には、例外がどこから来ているのかを理解するのが難しいことはめったにありません-行番号は通常それをかなり明確にします、そしてそれが明確でない状況は通常正確に簡単に与えることができない長い表現がある状況ですとにかく例外の単一の答え。
CLR /コンパイラは、行番号マッピングのように、「IL命令Xの場合、実行スタックの最上位は診断メッセージYの式からのものでした」という追加のテーブルについて合意することができると思います。しかし、それはかなり面倒なように感じます-そして私が言うように、それはあなたにそれほど頭痛を与えるべきではありません。