是否不可能让协变接口包含泛型类型,其类型参数是协变类型?



我有一个协变接口和不相关的泛型类。我希望协变接口有一个属性,它是协变类型上泛型类的实例,就像这样

public interface IFoo<out T>
{
Bar<T> barobj { get; set; }
}
public class Bar<T>
{
}

不幸的是,我收到了一个错误

错误CS1961无效方差:类型参数'T'必须在'IFoo<T>。barobj'T’是协变的。

这是否意味着不可能有一个具有使用协变类型作为参数的泛型类型的协变接口?我是不是做错了什么?

只有当接口只允许泛型类型的输出时,接口才能是协变的。您的接口不是协变的,因为您可以设置barobj的值。如果将属性设为只读,则如果barobj是协变的,则该属性可以是协变。这意味着您需要Bar:的协变接口

public interface IFoo<out T>
{
IBar<T> barobj { get; }
}
public class Bar<T> : IBar<T>
{
}
public interface IBar<out T> 
{
}

最新更新