繁体   English   中英

方法签名中的ICollection []

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM