无法获得通过引用传递参数的正确数据类型

本文关键字:参数 数据类型 引用 | 更新日期: 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);
}