5

我确定我在这里遗漏了一些东西,但是有什么特别的原因这不起作用吗?

public ObservableCollection<object> ItemCollection { get; set; }

private void SetListData<T>(List<T> MyList)
{
    ItemCollection = new ObservableCollection<object>(MyList);
}

T 在这不起作用的地方有一些价值吗?我认为对象集合将涵盖所有情况,但似乎不是:

错误 2 参数 1:无法从 'System.Collections.Generic.List <T>' 转换为 'System.Collections.Generic.List <object>'

更改属性的签名会导致一系列全新的问题,因此将其更改为:

ItemCollection = new ObservableCollection<T>(MyList);

似乎不是一个好的解决方案。谁能告诉我为什么我的原始代码不起作用,以及是否有任何简单的解决方法?

4

3 回答 3

7

你有几个选择:

private void SetListData<T>(List<T> MyList) where T : class

或者

ItemCollection = new ObservableCollection<object>(MyList.Cast<object>());

如果你有List<T>一个已知的引用类型,它可以工作,即使类型参数不是object

var list = new List<string>();
var observable = new ObservableCollection<object>(list);

但在这种情况下,您使用的是泛型参数,它不是已知的引用类型;它可能是一个值类型/结构。这些可以“装箱”为objects,但本质上不是objects。

因此,您必须要么将该参数限制为始终为引用类型,要么允许任何类型Tobject在方法体内部进行显式强制转换。

于 2013-06-19T13:45:09.220 回答
2

您快到了。仅当是引用类型时才可List<T>转换为IEnumerable<object>(由于协变) 。T因此,限制T为引用类型将起作用:

private void SetListData<T>(List<T> MyList) where T : class
{
    ItemCollection = new ObservableCollection<object>(MyList);
}
于 2013-06-19T13:46:17.457 回答
1

问题是“T”不是“object”,即使“T”继承了“object”。通用列表中的类型必须相同。

您的最佳解决方案如下:

ItemCollection = new ObservableCollection<object>();
foreach(T item in MyList)
{
    ItemCollection.Add(item);
}
于 2013-06-19T13:45:03.843 回答