2

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为什么会出错。而且由于我没有找到答案(在谷歌搜索了一会儿之后),我认为这个问题很有趣,值得在这里提问。似乎你们中的一些人不认为这是一个好问题并投票关闭它......

4

3 回答 3

8

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

假设第二种方法写成:

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

那必须编译,作为int[]implements IList<int>。但是,如果调用者实际上有一个 type 的变量,它会破坏类型安全,该变量List<int>现在引用了一个int[]...

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

于 2012-08-29T19:50:28.547 回答
1

尝试以下操作:

public virtual IList<int> SearchProducts(int categoryId)
{
    IList<int> categoryIds = new List<int>();
    if (categoryId > 0)
    categoryIds.Add(categoryId);
    return SearchProducts(ref categoryIds);
}
于 2012-08-29T19:50:31.893 回答
0

您需要向该方法传递一个可分配的 IList(of int)。

IList<int> categoryIds = new List<int>();
于 2012-08-29T19:51:58.753 回答