我有以下类结构:
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中的以下编译erorr。 类型'Test.Y'不能用作泛型类型或方法'Test.Z'中的类型参数'T'。没有从'Test.Y'到'Test.BInterface'的隐式引用转换。
我虽然仿制药中的协方差应该可以使这个工作吗?任何帮助将不胜感激。
答案 0 :(得分:4)
默认情况下,接口中的通用参数是不变的,您需要明确指定是否希望特定的通用参数是协变的或逆变的。基本上,在您的示例中,您需要在接口声明中添加“out”关键字:
public interface BInterface<out T> where T : AInterface { }
您可以在MSDN上找到有关创建变体界面的更多信息:Creating Variant Generic Interfaces (C# and Visual Basic)。
答案 1 :(得分:1)
我认为您错过了out
关键字。尝试将其添加到以下行:
public interface BInterface<out T> where T : AInterface { }
public class Z<out T> where T : BInterface<AInterface> {}
我不确定这两个地方是否都需要它。