接口协方差问题

时间:2010-09-07 11:13:39

标签: c# .net covariance

所以我有这样的代码。

public interface IGeoDataSet<out T> : IDataSet
    where T : IGeoPrimitive<IGeoPrimitiveContent>
{
    IEnumerable<T> Items { get; } 
}

public interface IDataSet { }

public interface IGeoPrimitive<T> : IPrimitive
    where T : IGeoPrimitiveContent
{
    T Content { get; }
}

public interface IPrimitive { }

public interface IGeoPrimitiveContent { }

以前接口的这种补充。

public class TriangleDataSet : IGeoDataSet<Triangle>
{
    public IEnumerable<Triangle> Items { get; private set; }
}

public class Triangle : IGeoPrimitive<TriangleContent>
{
    public TriangleContent Content { get; private set; }
}

public class TriangleContent : IGeoPrimitiveContent { }

当我尝试编译此代码时,我遇到了错误:

The type '.Triangle' cannot be used as type parameter 'T' in the generic type or method '.IGeoDataSet<T>'. There is no implicit reference conversion from '.Triangle' to '.IGeoPrimitive<.IGeoPrimitiveContent>'.

我无法理解为什么,也许有人知道这是什么问题?

BR, Jevgenij

3 个答案:

答案 0 :(得分:1)

为了能够使用IGeoPrimitive<T> Triangle作为IGeoDataSet<out T>实现的类型参数,您需要 // Note addition of 'out' keyword public interface IGeoPrimitive<out T> : IPrimitive where T : IGeoPrimitiveContent { T Content { get; } } 接口:< / p>

where T : IGeoPrimitive<IGeoPrimitiveContent>

这是因为你有一个IGeoPrimitive<T>约束;但如果没有Triangle协变,IGeoPrimitive<TriangleContent>(实现{{1}})会遇到此约束。

答案 1 :(得分:0)

您必须声明IGeoPrimitive<T>协变:

public interface IGeoPrimitive<out T> : IPrimitive
    where T : IGeoPrimitiveContent
{
    T Content { get; }
}

答案 2 :(得分:0)

最好将接口声明为:

public interface IGeoDataSet<out T, out V> : IDataSet
    where T : IGeoPrimitive<V>
    where V : IGeoPrimitiveContent
{
    IEnumerable<T> Items { get; } 
}

public interface IGeoPrimitive<out T> : IPrimitive
    where T : IGeoPrimitiveContent
{
    T Content { get; }
}