次の状況で、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 です。それが常に当てはまると仮定するのは正しいでしょうか、それとも例外ですか?