1

次の状況で、C# がコンストラクタ (またはメソッド) のどのオーバーロードを使用するかを決定する規則は何ですか?

  • オーバーロードは、パラメーターの型のみが異なります
  • オーバーロードはすべて同じ型階層の一部です

次の点を考慮してください。

  • List から派生したカスタム型 (ここでは部分的な表現にすぎません。演習のために、クラスがメタデータの概念を List に追加するとします):

    public class CustomList<Type> : List<Type>
    {
        public CustomList() : base() { }
    
        [...]
    
    }
    
  • クラス階層のさまざまなレベルを取るさまざまなコンストラクターを持つクラス:

    public class SomeClass
    {
        public SomeClass(IEnumerable<object> ienumerable) { }
    
        public SomeClass(IList<object> list) { }
    
        public SomeClass(CustomList<object> customList) { }
    }
    

次のコードで呼び出されるコンストラクターはどれですか?また、オーバーロードはどのように解決されますか?:

CustomList<object> customList = new CustomList<object>();

List<object> list = new List<object>();

IEnumerable<object> enumerable = new object[1];
IEnumerable<object> customListWrappedInEnumerable = new CustomList<object>();

SomeClass customListBuilt = new SomeClass(customList);

SomeClass listBuilt = new SomeClass(list);

SomeClass enumerableBuilt = new SomeClass(enumerable);
SomeClass wrappedCustomListBuilt = new SomeClass(customListWrappedInEnumerable);

二次的な質問として、コンストラクターのオーバーロード規則は他のインスタンス メソッドと同じですか? このクラスがある場合:

public static class DoSomethingClass
{
    public void DoSomething(IEnumerable<object> ienumerable) { }

    public void DoSomething(IList<object> list) { }

    public void DoSomething(CustomList<object> customList) { }
}

そして私は電話する

DoSomethingClass.DoSomething(list);
DoSomethingClass.DoSomething(customList);
DoSomethingClass.DoSomething(enumerable);
DoSomethingClass.DoSomething(customListWrappedInEnumerable);

動作はコンストラクターと同じですか、それとも異なりますか? さらに、DoSomethingClass が代わりにインスタンス型である場合、

DoSomethingClass do = new DoSomethingClass();
do.DoSomething(customListWrappedInEnumerable);
[...]

違いますか?

これまでの私の観察では、コンストラクター/メソッドに渡される参照の型によって、選択されるコンストラクターが完全に決定されます。つまり、IEnumerable コンストラクターへの IEnumerable オーバーロードにラップされた CustomList です。それが常に当てはまると仮定するのは正しいでしょうか、それとも例外ですか?

4

0 に答える 0