Question

I have the following class structure:

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>();
    }
}

This gives me the following compile erorr in C# 4.0. The type 'Test.Y' cannot be used as type parameter 'T' in the generic type or method 'Test.Z'. There is no implicit reference conversion from 'Test.Y' to 'Test.BInterface'.

I though the covariance in generics should make this work? Any help will be appreciated.

Was it helpful?

Solution

Generic parameters in interfaces are invariant by default, you need to explicitly specify whether you want a particular generic parameter to be covariant or contravariant. Basically, in your example you need to add "out" keyword to the interface declaration:

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

You can find more info about creating variant interfaces on MSDN: Creating Variant Generic Interfaces (C# and Visual Basic).

OTHER TIPS

I think you are missing the out keyword. Try adding it to the following lines:

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

I'm not sure if it's needed in both places, though.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top