views:

164

answers:

3
// The Structure of the Container and the items
public interface IContainer <TItem> where TItem : IItem
{

}

public class AContainer : IContainer<ItemA>
{

}

public interface IItem
{

}

public class ItemA : IItem
{

}

// Client app

[Test]
public void Test ()
{
 IContainer<IItem> container = new AContainer();
}

Question : In test the following error occures. What can be the solution for casting?

Cannot implicitly convert type 'AContainer' to 'IContainer'. An explicit conversion exists (are you missing a cast?)

+3  A: 

Another generics covariant problem...

Generic types in .NET are not covariant or contravariant - IContainer<ItemA> (which is what AContainer is) is not a subclass of IContainer<IItem> - there is no valid cast between the two. This will be fixed in C# 4.

thecoop
I note that in C# 4 we are adding covariance and contravariance **but** only on interfaces and delegates with reference type arguments in the varying positions, and only those interfaces and delegates which are known at compile time to be safe for variance.
Eric Lippert
+1  A: 

If you want to use AContainer to be an IContainer<IItem>, you need to implement this interface as well:

public class AContainer : IContainer<ItemA>, IContainer<IItem>

You may implement it explicitly.

Stefan Steinegger
A: 

You can also consider Simulated Covariance for .NET Generics by Krzysztof Cwalina

Dzmitry Huba