XSL*_*XSL 7 c# generics ilist interface list
我正在尝试创建一个方法,该方法返回用户想要的任何类型的列表.要做到这一点,我使用的是泛型,我不太熟悉,所以这个问题可能很明显.问题是此代码不起作用并抛出错误消息Cannot convert type Systems.Collections.Generic.List<CatalogueLibrary.Categories.Brand> to Systems.Collection.Generic.List<T>
private List<T> ConvertToList<T>(Category cat)
{
switch (cat)
{
case Category.Brands:
return (List<T>)collection.Brands.ToList<Brand>();
}
...
}
Run Code Online (Sandbox Code Playgroud)
但如果我使用IList,则没有错误.
private IList<T> ConvertToList<T>(Category cat)
{
switch (cat)
{
case Category.Brands:
return (IList<T>)collection.Brands.ToList<Brand>();
}
...
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,为什么我可以使用IList而不使用List?collection.Brands BrandCollection从第三方库返回一个类型,所以我不知道它是如何创建的.可能是BrandCollection从IList派生的(只是猜测它确实如此),所以它可以转换为它而不是正常的List?
由于没有约束T,它只能object在编译时转换.编译器不检查对接口类型的转换,因为理论上可以创建一个实现IList<object>和继承的新类List<Brand>.但是,强制转换List<T>将失败,因为已知不能创建一个继承了List<object>和的类List<Brand>.但是,在您的情况下,您T通过switch语句知道类型是什么,并希望强制执行转换.要做到这一点,object首先进行如下操作:
private List<T> ConvertToList<T>(Category cat)
{
switch (cat)
{
case Category.Brands:
return (List<T>)(object)collection.Brands.ToList<Brand>();
}
}
Run Code Online (Sandbox Code Playgroud)
但是,更大的设计问题是,当你有一个已知类型的离散列表时,泛型不是最好的选择T.当泛型T可以是任何东西,或者被限制为基本类型或接口时,泛型更好.在这里,你最好只为switch语句的每个分支编写一个单独的方法:
private List<Brand> ConvertToBrandList()
{
return collection.Brands.ToList<Brand>();
}
Run Code Online (Sandbox Code Playgroud)
没有这个,你的类型安全性很小.如果有人用你的方法调用ConvertToList<int>(Category.Brands)怎么办?
| 归档时间: |
|
| 查看次数: |
377 次 |
| 最近记录: |