当我尝试将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
,这就是为什么我得到错误。由于我没有找到答案(谷歌搜索一段时间后),我认为这个问题很有意思,值得在这里提问。似乎有些人认为这不是一个好问题,并投票决定将其关闭......
答案 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>();