函数参数中的 C# 列表

本文关键字:列表 参数 函数 | 更新日期: 2023-09-27 17:55:59

我是C#的新手。我想将一个列表作为参数,并从我从第一个列表获得的数据中返回另一个列表。

private List<DestinationGenericMapProps> ConstructDestinationMapPropsList(List<BoutiqueInWebService> datas)
{
    var result = new List<DestinationGenericMapProps>(datas);
    return result;
}

我收到此错误:

错误 241 System.Collections.Generic.List<VDDataUpdaterGeneric.DataObjects.DestinationGenericMapProps>.List(int)的最佳重载方法匹配有一些无效参数

我知道这可能是非常基本的,但我是 C# 的新手,并且为此而苦苦挣扎。感谢您的帮助。

函数参数中的 C# 列表

List<BoutiqueInWebService>不是List<DestinationGenericMapProps>

除非BoutiqueInWebService派生自DestinationGenericMapProps,否则这将不起作用。

基本上,有一个List<T>(IEnumerable<T>)构造函数,但 T 必须相同。

将返回类型更改为List<BoutiqueInWebService>并更改新语句:

private List<BoutiqueInWebService> ConstructDestinationMapPropsList(List<BoutiqueInWebService> datas)
{
    var result = new List<BoutiqueInWebService>(datas);
    return result;
}

或将参数更改为类型 List<DestinationGenericMapProps>

private List<DestinationGenericMapProps> ConstructDestinationMapPropsList(List<DestinationGenericMapProps> datas)
{
    var result = new List<DestinationGenericMapProps>(datas);
    return result;
}

或者,如果您知道如何从BoutiqueInWebService进行DestinationGenericMapProps,则可以使用System.Linq并对参数执行选择:

private List<DestinationGenericMapProps> ConstructDestinationMapPropsList(List<BoutiqueInWebService> datas)
{
    var result = datas.Select(x => new DestinationGenericMapProps() { ... }).ToList();
    return result;
}

您的方法返回类型是DestinationGenericMapProps列表,但您正在尝试创建BoutiqueInWebService列表(即数据)。

您可以执行此操作以匹配您的返回类型:

private List<DestinationGenericMapProps> 
        ConstructDestinationMapPropsList(List<BoutiqueInWebService> datas)
{
    return (from d in datas
            select new DestinationGenericMapProps()
            {
                // map properties here
                Prop1 = d.SomePropInData
            }).ToList();
}

您收到错误是因为您尝试使用不同类型的列表(BoutiqueInWebService)中的对象填充一种类型(DestinationGenericMapProps)的列表,该列表不是类型安全的。

只有当BoutiqueInWebService继承自DestinationGenericMapProps时,您才能执行此操作。

C# 支持函数重载,这意味着只要参数不同,一个类就可以有多个同名的函数。编译器通过压缩参数的类型来决定调用哪个重载。这也适用于构造函数。

List 类的构造子有三个重载:

List<T>()
List<T>(IEnumerable<T>)
List<T>(int)

我假设您正在尝试使用其中的第二个,因为它将从传入的列表创建一个新列表。对于您正在创建的列表,T 是一个 DestinationGenericMapProps。所以构造函数是:

List<DestinationGenericMapProps>()
List<DestinationGenericMapProps>(IEnumerable<DestinationGenericMapProps>)
List<DestinationGenericMapProps>(int)

您传入的列表已将 T 设置为 BoutiqueInWebService。因此,编译器试图在上面的列表中找到这样的构造函数。

List<DestinationGenericMapProps>(IEnumerable<BoutiqueInWebService>)

由于找不到,因此会引发您收到的错误。

是否可以将 BoutiqueInWebService 转换为 DestinationGenericMapProps 对象?如果是这样,您可以这样做:

var result = datas.Cast<DestinationGenericMapProps>().ToList()

如果无法直接投射,则可以像这样进行长手投掷:

var result = datas.Select(o => new DestinationGenericMapProps() { PropA = o.PropA, PropB = o.PropB /* etc */}).ToList();