Bに関して、Henk は完璧な答えを出しました (編集: 現在は削除されています) int x = x = 1;
。(私はxが初期化子の後まで宣言されたとは見なされないと思っていたでしょう。ああ、まあ。) 彼の答えは次のとおりでした:
int x = x = 1; // Compiles
var y = y = 2; // Does not compile
Aと、コンパイル時の型が実行時の型と一致しない場合についての質問について、それらが異なる例を次に示します。
var foo = fooFactory.GetFoo();
... そして fooFactory のそのメソッドは .... として実装されます。
public FooBase GetFoo() {
return new FooSubtype();
}
ここで、fooの型は FooBase (インターフェイス、抽象クラス、または封印されていない具象クラスの場合があります) であり、(キャストなしで) その機能のみが利用可能です。明らかに、FooSubtype は FooBase を実装または継承しています。
実行時にfooが保持する型は、GetFoo() の実装を示しているため、ここで識別できますが、コンパイラによって検査されません。実際、実装が利用できない (別のアセンブリにある可能性がある) か、異なる可能性があります (仮想である可能性があります)。GetFoo() のコンパイル時の型、つまりfooの型を決定するには、メソッド宣言のみが関係します。