7

次のコードはあいまいな呼び出しですが、エラーが発生しないobject代わりに使用すると問題が発生し、バージョンが正常に動作するため、コンパイラ エラーが発生します。それについての説明はありますか?ArrayListstring

class A
{
    public A(string x)
    {
        Console.WriteLine("string");
    }
    public A(ArrayList x)
    {
        Console.WriteLine("ArrayList");
    }

}
    static void Main(string[] args)
        {
            A o = new A(null);
        }
4

6 に答える 6

16

ArrayListを受け取るコンストラクタを an に変更した場合にコードが正常に機能する理由objectは、C# コンパイラが適用可能な最も具体的な型を選択するためです。string/の場合objectstring実際にはから派生objectするため、「より具体的」であり、コンパイラによって推論されます。stringvsを使用するとArrayList、リンゴとオレンジになります。どちらかが null になる可能性がありますが、どちらも他方よりも「具体的」ではありません。

于 2010-05-19T12:32:24.227 に答える
4

私は間違っている可能性がありますが、ArrayList をオブジェクトに変更すると機能する理由は、文字列がオブジェクトから継承され、より具体的な文字列バージョンを使用することを決定したためだと思います。文字列と ArrayList の場合、どちらを使用すればよいかわかりません。

于 2010-05-19T12:32:11.090 に答える
3

nullstring、または のいずれかを表すことができますArrayList。あなたが意図したメソッド (この場合はコンストラクター) のどのバージョンに関する情報はありません。

キャストすることで、特定のものを使用するように強制できます。

static void Main(string[] args)
    {
        A o = new A((string)null);
    }

...または、代わりに、必要に応じて動作するコンストラクターを実装します (パラメーターをとらない)

于 2010-05-19T12:27:51.133 に答える
1

ArrayListstringは両方nullableのタイプです。それはコンパイラを混乱させます。

2つのコンストラクターがある場合、1つはnull許容型(例ArrayList)を取り、もう1つはnon-nullableタイプ(例)を取りますint。コードはコンパイルされ、型を持つコンストラクターが選択されますnullable

nullableしかし、型をとるコンストラクターが複数ある場合は、@ Dan Taoのように、リンゴとオレンジのように、どちらもnullにすることができますが、どちらももう一方よりも「具体的」ではありません。

例えば:

class A
{
    public A(int x)
    {
        Console.WriteLine("string");
    }
    public A(ArrayList x)
    {
        Console.WriteLine("ArrayList");
    }

}

このコードはコンパイルされますが、変更public A(int x)tpublic A(int? x)てもコンパイルされません。

于 2010-05-19T12:47:29.510 に答える
1
  1. もちろんnullあいまいstringですArrayList。のように修飾する必要があります(string) null
  2. ArrayList非推奨であることをご存知ですか?代わりに、ジェネリック コレクション型のいずれかを使用する必要があります。
于 2010-05-19T12:29:01.407 に答える