c#泛型问题

UpT*_*eek 0 c# generics

谁能告诉我为什么这不起作用?我原以为约束会使它有效.

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)