Kev*_*lia 5 c# generics .net-4.0 observablecollection
我确定我在这里遗漏了一些东西,但是这有什么特别的原因不起作用?
public ObservableCollection<object> ItemCollection { get; set; }
private void SetListData<T>(List<T> MyList)
{
ItemCollection = new ObservableCollection<object>(MyList);
}
Run Code Online (Sandbox Code Playgroud)
T这有什么价值吗?我认为对象的集合将覆盖每个案例,但似乎不是:
错误2参数1:无法从'System.Collections.Generic.List
<T>' 转换为'System.Collections.Generic.List<object>'
更改属性的签名会导致一组全新的问题,因此将其更改为:
ItemCollection = new ObservableCollection<T>(MyList);
Run Code Online (Sandbox Code Playgroud)
似乎不是一个好的解决方案.任何人都可以告诉我为什么我的原始代码不起作用,如果有任何简单的解决方案?
你有几个选择:
private void SetListData<T>(List<T> MyList) where T : class
Run Code Online (Sandbox Code Playgroud)
要么
ItemCollection = new ObservableCollection<object>(MyList.Cast<object>());
Run Code Online (Sandbox Code Playgroud)
如果你有一个List<T>已知的引用类型,它可以工作,即使type参数不是object:
var list = new List<string>();
var observable = new ObservableCollection<object>(list);
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,您使用的是泛型参数,该参数不是已知的引用类型; 它可以是值类型/结构.这些可以"装箱"为objects但不是固有object的.
因此,您必须将该参数约束为始终为引用类型,或者允许任何类型T并object在方法体内进行显式转换.