3

我有以下类结构:

public class A : AInterface { }
public interface AInterface { }

public class B<T> : BInterface<T> where T : AInterface 
{
    public T Element { get; set; }
}
public interface BInterface<T> where T : AInterface 
{
    T Element { get; set; }
}

public class Y : B<A> { }

public class Z<T> where T : BInterface<AInterface> {}

public class Test
{
    public Test()
    {
        Z<Y> z = new Z<Y>();
    }
}

这给了我在 C# 4.0 中的以下编译错误。类型“Test.Y”不能用作泛型类型或方法“Test.Z”中的类型参数“T”。没有从“Test.Y”到“Test.BInterface”的隐式引用转换。

我虽然泛型中的协方差应该使这项工作?任何帮助将不胜感激。

4

2 回答 2

4

接口中的泛型参数默认情况下是不变的,您需要明确指定您希望特定泛型参数是协变的还是逆变的。基本上,在您的示例中,您需要在接口声明中添加“out”关键字:

public interface BInterface<out T> where T : AInterface { } 

您可以在 MSDN 上找到有关创建变体接口的更多信息:Creating Variant Generic Interfaces (C# and Visual Basic)

于 2009-12-29T18:32:16.637 回答
1

认为您缺少out关键字。尝试将其添加到以下行:

public interface BInterface<out T> where T : AInterface { }
public class Z<out T> where T : BInterface<AInterface> {}

不过,我不确定这两个地方是否都需要它。

于 2009-12-29T04:21:19.847 回答