我有以下代码:
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>.
非常感谢你的帮助.
编辑:更新了代码,因为它包含错误.
为什么会这样?
问题是我可以写这样的代码:
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>等类.
| 归档时间: |
|
| 查看次数: |
612 次 |
| 最近记录: |