创建集合的自定义用户集合

时间:2015-08-30 19:42:19

标签: c# generics generic-collections custom-collection

我需要创建一个泛型集合的泛型集合,它应该包含一个泛型类。我已经努力了,但是没有找到任何答案。这就是我的实现集合的样子:https://github.com/Infatum/PMC-Data-Model/blob/master/WTF/Position.cs这是泛型Point的位置集合。我需要创建一个名为Matrix的位置索引集合,Matrix的索引集合Container和一个名为Containers的容器索引集合。拜托,帮助我!

public class Matrix<T> : ICollection<T> where T : Position<T>
{
    protected ArrayList matrix;
    protected bool isReadOnly;

    public Matrix()
    {
        matrix = new ArrayList();
    }
// ...
}

麻烦:类型&#39; T&#39;不能用作类型参数&#39; T&#39;通用类型或方法&#39;位置&#39;来自&#39; T&#39;没有隐式参考转换。到&#39; WTF.Point&#39;

这实际上是给我的任务:https://docs.google.com/document/d/1ZYXXAjrh0OYNLUuFy0HT6ZuAzISIecE73cgA4QoRDlc/edit#heading=h.nwbuqfwpq3gk

1 个答案:

答案 0 :(得分:2)

T上的类型约束是递归的 - 我认为你不希望这样做。 (编译器也没有:约束强制T成为某种Position<T>。这意味着Position<T>实际上是Position<Position<T>> - 这违反了对通用的类型约束Position的参数,它预期WTF.Point而不是Position

解决方案:

public class Matrix<T> : ICollection<Position<T>>

但是让我再详细说明一下: 从某种意义上说,你需要像

这样的东西
public class Matrix<T> : ICollection<T> where T : Position<U>

所以没有更多的递归。您希望T成为“某种Position”。但现在我们会遇到一个新问题:U(我们称之为“元素类型”)来自哪里?您应该使用 作为Matrix的泛型类型参数:

public class Matrix<U> : ICollection<T> where T : Position<U>

现在,约束可以直接折叠到接口类型中,即ICollection<Position<U>>完全给出我上面给出的解决方案(模数名称)。