尝试将ref添加到重载方法的参数时出错

时间:2012-08-29 19:42:58

标签: c#

当我尝试将ref添加到重载方法的参数时,为什么会出现以下错误?

  

最佳重载方法匹配   'WindowsFormsApplication1.Form1.SearchProducts(int)'有一些无效   参数

     

参数1:无法转换为'ref   System.Collections.Generic.List'到'int'

这是一些(简化的)代码:

public virtual IList<int> SearchProducts(int categoryId)
{
    List<int> categoryIds = new List<int>();
    if (categoryId > 0)
        categoryIds.Add(categoryId);
    return SearchProducts(ref categoryIds);
}

public virtual IList<int> SearchProducts(ref IList<int> categoryIds)
{
    return new List<int>();
}

修改

有些人问我为什么在这种情况下需要ref,答案是我可能不需要它,因为我可以清除列表并添加新元素(我不需要创建一个新的参考)。但问题不在于我需要或不需要ref,这就是为什么我得到错误。由于我没有找到答案(谷歌搜索一段时间后),我认为这个问题很有意思,值得在这里提问。似乎有些人认为这不是一个好问题,并投票决定将其关闭......

3 个答案:

答案 0 :(得分:8)

当您通过引用传递参数时,编译时类型必须是 exact 与参数类型相同的类型。

假设第二种方法写成:

public virtual IList<int> SearchProducts(ref IList<int> categoryIds)
{
    categoryIds = new int[10];
    return null;
}

必须编译,因为int[]实现了IList<int>。但是,如果调用者实际上具有List<int>类型的变量,它现在会引用int[] ...

,则会破坏类型安全性

您可以通过在调用方法categoryIds而不是IList<int>中声明List<int>的声明类型来解决此问题 - 但我强烈怀疑您没有实际上想要首先通过引用传递参数。需要这样做是相对罕见的。您对C# parameter passing感到满意吗?

答案 1 :(得分:1)

尝试以下方法:

public virtual IList<int> SearchProducts(int categoryId)
{
    IList<int> categoryIds = new List<int>();
    if (categoryId > 0)
    categoryIds.Add(categoryId);
    return SearchProducts(ref categoryIds);
}

答案 2 :(得分:0)

您需要将方法传递给可赋值的IList(int)。

IList<int> categoryIds = new List<int>();