为什么我不能将List <T>传递给通用构造函数参数,尽管满足所有约束条件?

feO*_*O2x 2 c# generics

我有以下代码:

public class SampleClass<T, TCollection> where TCollection : class, IList<T>, IReadOnlyList<T>
{
    private readonly TCollection _collection;

    public SampleClass() : this(new List<T>()) { }

    public SampleClass(TCollection collection)
    {
        _collection = collection;
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,包含默认构造函数的行public SampleClass() : this(new List<T>()) { }无法编译.错误消息说:参数1:无法从'System.Collections.Generic.List'转换为'TCollection'.

为什么会这样?List<T>实际上满足了我对TCollection泛型的所有限制:它是一个实现IList<T>和的类IReadOnlyList<T>.

非常感谢你的帮助.

编辑:更新了代码,因为它包含错误.

Tim*_*lds 5

为什么会这样?

问题是我可以写这样的代码:

class X : IList<int>, IReadOnlyList<int>
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后尝试使用它:

var instance = new SampleClass<int, X>();
Run Code Online (Sandbox Code Playgroud)

但没有转换List<int>X.

此方案的可能性是您收到编译器错误消息的原因:

参数1:无法从'System.Collections.Generic.List'转换为'TCollection'.

要获得List<T>您正在寻找的"默认"行为,您可以摆脱该默认构造函数并将其替换为以下内容:

static class SampleClass
{
    public static SampleClass<T, List<T>> Create<T>()
    {
        return new SampleClass<T, List<T>>(new List<T>());
    }
}
Run Code Online (Sandbox Code Playgroud)

这类似于一个图案Tuple静态类与它的静态Tuple.Create的通用方法和非静态Tuple<T1>,Tuple<T1, T2>等类.