1

C#への回答によると: オーバーロードされたメソッドに null を渡す - どのメソッドが呼び出されますか? 、ヌルは型情報を運ぶようです。実際、私も使用できます

class Program
{
    static void Method(TypeA a)
    {
        Console.Write("Output of Method(TypeA a):");
        Console.WriteLine(a); // Prints nothing, on account of the null.
    }
    static void Method(TypeB b)
    {
        Console.Write("Output of Method(TypeB b):");
        Console.WriteLine(b); // Also prints nothing, on account of the null.
    }
    static void Main()
    {
        var a = (TypeA)null;
        var b = (TypeB)null;
        Method(a);
        Method(b);
    }
}
class TypeA { }
class TypeB { }

どの利回り

メソッドの出力 (TypeA a):
メソッドの出力 (TypeB b):

何が起きてる?

4

4 に答える 4

3

いいえ、null 自体は型情報を持ちません。キャストは、変数の型が何であるかをコンパイラに伝えるだけです...参照型またはnull許容型に変換できるため、キャストなしではわかりません。abnull

これらの変数の型は、オーバーロード解決で使用されます。ここでの選択は単にコンパイル時に行われることを忘れないでください。引数の実行時の値はまったく関係ありません。

あなたのコードは以下と正確に同等です:

TypeA a = null;
TypeB b = null;
Method(a);
Method(b);

代わりに実行時にオーバーロード解決が実行されるように動的型付けを使用した場合、次のように失敗します。

dynamic foo = (TypeA) null; // Or without the cast. It makes no difference.
Method(foo); // RuntimeBinderException at execution time, due to ambiguity
于 2014-05-29T20:39:28.293 に答える
0

を記述するvarと、コンパイラは、変数に割り当てているものに基づいて変数の型を決定しています。

明示的な (C スタイルの) キャストを行うことで、「これがこの型です」と言ってそれをvar拾い上げ、オーバーロードが表示どおりに動作するようにします。

「null」を割り当てることは、任意の参照型に対して有効な値です (もちろんコンパイルされます) が、型情報はキャストによって提供されます。

于 2014-05-29T20:39:15.837 に答える
0

null は型情報を持っているようです

いいえ、変数には型があります。 nullはちょうどnullです。 どのメソッドが呼び出されるかは、コンパイル時に決定されます。これを行う場合:

var a = (TypeA)null;     
var b = (TypeB)null;
Method(a);
Method(b);

呼び出しで型の変数を使用するため、コンパイラはにバインド Method(a)します。についても同様です。あなたが参照する質問は、バインディングをより詳細に説明しています。Method(TypeA)TypeAMethod(b)

型情報が含まれていないことを証明するにnullは、メソッド バインディングを実行時に延期する 3 番目の呼び出しを追加します。

static void Main()
{
    var a = (TypeA)null;
    var b = (TypeB)null;
    dynamic c = a;
    Method(a);
    Method(b);
    Method(c);   // will throw a `RuntimeBinderException` since the type of c can't be determined at run-time.
}
于 2014-05-29T20:40:45.513 に答える