gpt4 book ai didi

c# - 通用列表 : The type arguments for method cannot be inferred from the usage in lambdas

转载 作者:太空宇宙 更新时间:2023-11-03 13:15:22 25 4
gpt4 key购买 nike

我在 C# 中遇到了一个问题,给我一个错误“无法从用法中推断出方法的类型参数”。似乎编译器无法确定正确的接口(interface),如果我从非通用列表中导出通用列表:

代码:

public class SpecialItem : BaseItem
{
public string Title { get; set; }
}

public class BaseItem
{
public string Name { get; set; }
}


public class GenericList<T> : NongenericBaseList, IEnumerable<T>
where T: BaseItem
{
public new T this[int index]
{
get { return _items[index] as T; }
}

public new IEnumerator<T> GetEnumerator()
{
var iter = _items.GetEnumerator();
while (iter.MoveNext())
{
yield return iter.Current as T;
}
}
}


public class NongenericBaseList : IEnumerable<BaseItem>
{
protected List<BaseItem> _items;

public BaseItem this[int index]
{
get { return _items[index]; }
}

public IEnumerator<BaseItem> GetEnumerator()
{
return _items.GetEnumerator();
}

IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}

用法:

    var genericList = new GenericList<SpecialItem>();
foreach (var item in genericList) // Uses IEnmerable<SpecialItem>, OK!
{
Console.WriteLine(item.Title);
}

var l = genericList.ToList(); // ERROR!

ForEarch 获得了正确的枚举器(SpecialItem),但 lambda 不知道使用什么(IEnumerable<BaseItem>IEnumerable<SpecialItem>)。

要做什么?如何设置 IEnumerable<SpecialItem>作为“默认”界面?我不想一直像这样明确地编码类型:

var l = genericList.ToList<SpecialItem>();

最佳答案

首先:感谢您提供了一个独立的示例!

您不能为类型推断指定“默认”接口(interface)。 ToList<T> 的参数类型无法解析,因为它不明确,该类型同时实现了 IEnumerable<BaseItem>IEnumerable<SpecialItem> , 两个版本都适用。

是否有可能删除类 NongenericBaseList完全,并使用 GenericList<T>反而?那会解决你的问题;你可以使用 GenericList<BaseItem>而不是 NongenericBaseList

另一种选择是反向继承;制作NongenericBaseList为空并派生自 GenericList<BaseItem> .

关于c# - 通用列表 : The type arguments for method cannot be inferred from the usage in lambdas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26549001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com