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 th开发者_开发知识库e covariance in generics should make this work? Any help will be appreciated.
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).
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.
精彩评论