简体   繁体   中英

Is it not possible to have a covariant interface contain a generic type who's type parameter is the covariant type?

I have a covariant interface and generic class that is unrelated. I'd like the covariant interface to have a property that is an instance of that generic class on the covariant type, like so.

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

public class Bar<T>
{
}

Unfortunately I'm getting an error

Error CS1961 Invalid variance: The type parameter 'T' must be invariantly valid on 'IFoo<T>.barobj'. 'T' is covariant.

Does this mean that it's impossible to have a covariant interface with a generic type that uses the covariant type as the parameter? Am I doing something wrong here?

An interface can only be covariant if it only allows outputs of the generic type. Your interface is not covariant because you can set the value of barobj . If you make the property read-only, then it can be covariant if barobj is covariant. So that means you need a covariant interface for Bar :

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

public class Bar<T> : IBar<T>
{
}

public interface IBar<out T> 
{
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM