无法获得通过引用传递参数的正确数据类型
本文关键字:参数 数据类型 引用 | 更新日期: 2023-09-27 17:49:18
我这里需要帮助,我一直收到一个错误…在这部分中有一些无效参数:
this.Search(ref objResult, sSQL);
我不能将集合作为引用传递。
internal override Models.BaseCollectionModel<Models.CategoryModel> OnFind(string objQueryArgs)
{
Models.Collection.CategoryCollectionModel objResult = new Models.Collection.CategoryCollectionModel();
string sSQL = string.Empty;
sSQL = "SELECT * FROM " + this.TableName;
this.Search(ref objResult, sSQL);
return objResult;
}
internal virtual void Search(ref System.Collections.IEnumerable objResult, string sQuery)
{
//statement goes here...
}
只是附加信息CategoryCollectionModel继承自Models.BaseCollectionModel<Models.CategoryModel>
它也继承了System.Collections.ObjectModel.ObservableCollection<T>
根据方法声明为objResult
IEnumerable
设置类型:
System.Collections.IEnumerable objResult =
^------+----------^
|
+- with the right using directives, this part is redundant
ref
形参必须匹配声明,它不能是赋值兼容的,它必须与声明完全一致。
原因是该方法可以将该变量的内容替换为相同类型的不同值,但不能保证是CategoryCollectionModel。
这里有一个对照问题:你真的需要ref
吗?
为什么有ref
参数?是因为您想要一个对集合的引用,而不是集合的副本吗?或者你真的打算换一个完全不同的系列?
注意,List
是一个引用类型。这意味着它(值)是通过引用传递的。从被调用的方法内部操作值或内容也会更改源对象。这是引用类型的默认行为。
请记住,使用ref或out方法签名必须匹配:参数必须与传递的对象完全相同类型。这对于内存分配是必要的。假设List和IEnumerable可以代替IEnumerable对象级别上的List访问,但是由于它们的类型不同,它们在不同的位置分配不同的内存量。它们在内存中的帧是不一样的,所以指针会变得无效。因此,在使用ref
或编码非托管(使用指针)时,请对类型进行一些尊重。
两个列表(原始和副本)都指向相同的值(默认行为)传递引用类型):
List<int> originalList = new List<int>();
originalList.add(1);
AddMore(originalList);
private void AddMore(List<int> list)
{
// OriginalList will now also contain two objects (Count = 2)
// Both lists are sharing the same reference and therefore are pointing
// to the same memory location
list.Add(2);
// Create a new reference for variable of type List<int>.
// This will override list but not originalList
// originalList.Count is still 2!
list = new List<int>();
// originalList still has two objects. Not three!
// The local variable is now pointing to a new/ different memomory location
// than originalList is pointing to
list.Add(3)
}
如果期望的行为是originalList变量也应该指向一个新的引用(相同!),那么ref
将完成这项工作。list和originalList则是相等的对象(相同的引用):
private void AddMore(ref List<int> list)
{
// OriginalList will now also contain two objects (Count = 2)
// Both (original and copy) are pointing to the same values since the variables
// are now equal
list.Add(2);
// This creates a new reference for BOTH variables!
// originalList.Count is now 0
list = new List<int>();
// Both list's count is now 1!
list.Add(3);
}