[英]ICollection[] in method signature
我有以下代码。 为什么总是使用“ take(ICollection a)”方法? 我认为它本身的对象应该是LinkedList或HashSet,因此它应该调用其他两个take方法。
class Program
{
static void Main(string[] args)
{
Program p = new Program();
ICollection<String>[] ary = { new LinkedList<String>(), new HashSet<String>() };
foreach (ICollection<String> a in ary)
{
p.take(a);
}
for (int i = 0; i < ary.Length; i++)
{
p.take(ary[i]);
}
}
public void take(HashSet<String> a)
{ }
public void take(LinkedList<String> a)
{}
public void take(ICollection<string> a)
{ }
}
方法分派是根据变量类型而不是运行时类型完成的。 在C#语言规范7.5.3(重载分辨率)中对此进行了详细介绍-在整个部分中都没有建议使用变量的运行时类型 。 调度由编译器根据“参数表达式”处理:
给定一个带有一组参数表达式{E1,E2,...,EN}的参数列表A以及两个适用的函数成员MP和MQ,它们的参数类型为{P1,P2,...,PN}和{Q1,Q2, ...,QN},如果满足以下条件,则MP被定义为比MQ更好的函数成员
•对于每个参数,从EX到QX的隐式转换并不比从EX到PX的隐式转换更好,并且
•对于至少一个参数,从EX到PX的转换要好于从EX到QX的转换。
如果要动态分配,可以通过dynamic
:
foreach (ICollection<String> a in ary)
{
dynamic o = a;
p.take(o);
}
或者,更短的形式:
foreach (dynamic a in ary)
{
p.take(a);
}
请参阅: http : //msdn.microsoft.com/en-us/library/aa691336(v=vs.71).aspx
和http://msdn.microsoft.com/en-us/library/aa691338(v=vs.71).aspx
从MSDN:
给定具有一组参数类型{A1,A2,...,AN}的参数列表A和两个适用的函数成员MP和MQ,参数类型为{P1,P2,...,PN}和{Q1,Q2, ...,QN},如果满足以下条件,则MP被定义为比MQ更好的函数成员:
- 对于每个参数,从AX到PX的隐式转换不比从AX到QX的隐式转换差,并且
- 对于至少一个参数,从AX到PX的转换要好于从AX到QX的转换。
在执行此评估时,如果MP或MQ以其扩展形式适用,则PX或QX以参数列表的扩展形式引用一个参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.