谁能告诉我为什么这不起作用?我原以为约束会使它有效.
public class ClassA<T> where T : ICommon
{
public ClassA()
{
ClassB b = new ClassB();
IEnumerable<T> alist = new List<T>;
b.Items = alist;
//Error: cannot convert from IEnumerable<T> to IEnumerable<ICommon>'
}
}
public class ClassB
{
public IEnumerable<ICommon> Items { get; set;}
....
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 12
这将在C#4中进行调整,但在C#3中不起作用.您要寻找的是泛型方差,自.NET 2.0以来CLR一直支持它,但直到v4才在C#中支持.
即使在C#4中,您也需要将T约束为引用类型 - 因为协方差不适用于值类型.例如,即使实现List<int>也无法转换为.IEnumerable<IComparable>intIComparable
稍微调整了一下你的代码(实际上有一些错别字),这可以用C#4编译器编译:
using System.Collections.Generic;
public interface ICommon {}
// Note the "class" part of the constraint
public class ClassA<T> where T : class, ICommon
{
public ClassA()
{
ClassB b = new ClassB();
IEnumerable<T> alist = new List<T>();
b.Items = alist;
}
}
public class ClassB
{
public IEnumerable<ICommon> Items { get; set;}
}
Run Code Online (Sandbox Code Playgroud)
如果您遇到C#3和.NET 3.5,可以选择使用Cast<T>():
b.Items = alist.Cast<ICommon>();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
140 次 |
| 最近记录: |