gpt4 book ai didi

将泛型添加到动态集合时的 ​​C# 怪异行为

转载 作者:太空狗 更新时间:2023-10-30 01:23:13 27 4
gpt4 key购买 nike

作品

private void Add<H>(H toAdd, IList<dynamic> list)
{
list.Add(toAdd);
}

没用

private void Add<H>(IList<H> toAdd, IList<IList<dynamic>> list)
{
list.Add(toAdd);
}

如你所想,错误是

The best overloaded method match for 'System.Collections.Generic.ICollection<System.Collections.Generic.IList<dynamic>>.Add(System.Collections.Generic.IList<dynamic>)' has some invalid arguments

如果有人知道为什么会这样或者更好,如何解决它,我很好奇。我认为它与通用方差有关,但动态让我不太确定。

谢谢,汤姆

编辑

   //doesn't work
private void Add<H>(IList<H> toAdd, IList<IList<dynamic>> list) where H : object
{
list.Add(toAdd);
}

//works
//this isn't good enough however because I only want to be able to
//have one type of object in toAdd
private void Add(IList<object> toAdd, IList<IList<dynamic>> list)
{
list.Add(toAdd);
}

//works
private void Add<H>(IList<H> toAdd, IList<IList<dynamic>> list)
{
list.Add(toAdd.Cast<dynamic>().ToList());
}

private void Foo()
{
//works
IList<dynamic> list1 = new List<object>();
//works
IList<object> list2 = new List<dynamic>();
//works
IList<IList<dynamic>> list4 = new List<IList<object>>();
//works
IList<IList<object>> list3 = new List<IList<dynamic>>();
}

我添加了更多示例(并不奇怪)只是为了说明

最佳答案

那是因为你不能施放 IList<H>IList<dynamic> .想象一下会发生什么:

IList<H> myList = new List<H>(...);
IList<dynamic> myDynamicList = myList; // assuming this would compile
myDynamicList.Add(new Foo()); // boom

您可以尝试保留 IEnumerable<dynamic> 的列表而不是 IList<dynamic> , 自 IEnumerable<out T>具有协变类型参数。

关于将泛型添加到动态集合时的 ​​C# 怪异行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11857512/

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