在以下情况下,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重载中的CustomList包含在IEnumerable构造函数中。假设情况总是如此,或者是他们的例外吗?我是否正确?