在c#中循环泛型类型

时间:2016-02-23 16:03:39

标签: c# generics

我需要制作图形,我希望边缘和顶点是通用类型

public interface IVertex<TVertex, TEdge>
        where TVertex : IVertex<?>
        where TEdge : IEdge<?>
{
    bool AddEdge(TEdge e);
    TEdge FindEdge(TVertex v);
}

public interface IEdge<TVertex> where TVertex : IVertex<?>
{
    TVertex From { get; }
}

但是,边缘需要顶点类型,顶点需要边缘类型 我该怎么办?

4 个答案:

答案 0 :(得分:6)

我认为你需要将它变得更加复杂 这样的事情会起作用吗?

public interface IVertex<T>
{
    bool AddEdge(IEdge<T> e);
    IEdge<T> FindEdge(IVertex<T> v);
}

public interface IEdge<T>
{
    IVertex<T> From { get; }
}

答案 1 :(得分:2)

好像你想要edge和vertex存储一些值。如果您希望顶点具有TV值且边缘具有TE值,则可以执行以下操作:

public interface IVertex<TV, TE>
{
    TV Value { get; }
    bool AddEdge(IEdge<TV, TE> e);
    IEdge<TV, TE> FindEdge(IVertex<TV, TE> v);
}

public interface IEdge<TV, TE> 
{
    TE Value { get; }
    IVertex<TV, TE> From { get; }
}

答案 2 :(得分:2)

问题是您已使用类型约束创建了递归定义。您说IVertex<A>其中A必须是IVertex<B>,其中B必须是IVertex<C>等等...在某些时候您必须指定实际指定一个type或interface作为通用参数。已经提出了几个好的解决方案。如果你需要更多的选择,这是另一个......

您可以引入另一种类型或接口(非泛型)来打破递归定义。

public interface IVertex<TVertex, TEdge>
        where TVertex : IVertex
        where TEdge : IEdge
{
    bool AddEdge(TEdge e);
    TEdge FindEdge(TVertex v);
}

public interface IEdge<TVertex> where TVertex : IVertex
{
    TVertex From { get; }
}

答案 3 :(得分:2)

虽然它是否可以说是一个好主意,但编译器并没有想到这种“循环”定义:

interface IVertex<TVertex, TEdge> where TVertex : IVertex<TVertex,TEdge>
                                  where TEdge : IEdge<TVertex,TEdge>
{

}

interface IEdge<TVertex, TEdge> where TVertex : IVertex<TVertex, TEdge>
                                where TEdge : IEdge<TVertex, TEdge>
{

}

然后你可以写,例如:

class FooVertex : IVertex<FooVertex,BarEdge>
{

}

class BarEdge : IEdge<FooVertex,BarEdge>
{

}