所以我有这样的代码。
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
答案 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; }
}