在以下情况下,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 构造函数。我假设总是如此,还是他们的例外是正确的?