4

作品

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>>();
   }

我添加了更多示例(并不令人惊讶)只是为了说明

4

2 回答 2

6

那是因为您不能将 anIList<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>它有一个协变类型参数。

于 2012-08-08T04:12:56.857 回答
-2

您正在尝试将列表“toAdd”添加到列表列表(“list”)中,因此您会看到错误...

于 2012-08-08T05:08:29.840 回答