Is it possible to make the following code compile in C#? I do compile similar in Java.
public interface IInterface
{
...
}
public class Class1 : IInterface
{
...
}
public abstract class Base<T> where T : IInterface
{
...
}
public class Class2<T> : Base<T> where T : IInterface
{
...
}
.
.
.
public SomeMethod()
{
List<Base<IInterface>> list = new List<Base<IInterface>>();
Class2<Class1> item = new Class2<Class1>();
list.Add(item); // Compile error here
}
No, that is not legal in C#. C# 4 and above support covariance and contravariance of generic interfaces and generic delegates when they are constructed with reference types. So for example, IEnumerable<T>
is covariant, so you could say:
List<Giraffe> giraffes = new List<Giraffe>() { ... };
IEnumerable<Animal> animals = giraffes;
but not
List<Animal> animals = giraffes;
Because a list of animals can have a tiger inserted into it, but a list of giraffes cannot.
Do a web search on covariance and contravariance in C# and you'll find lots of articles on it.
Looks like .NET Framework 4.0 supports covariance in generic interfaces and delegates. So, I happened to compile the code by adding a generic interface.
public interface IInterface
{
...
}
public class Class1 : IInterface
{
...
}
public interface IBase<out T> where T: IInterface
{
// Need to add out keyword for covariance.
}
public class Base<T> : IBase<T> where T : IInterface
{
...
}
public class Class2<T> : Base<T> where T : IInterface
{
...
}
.
.
.
public SomeMethod()
{
List<IBase<IInterface>> list = new List<IBase<IInterface>>();
Class2<Class1> item = new Class2<Class1>();
list.Add(item); // No compile time error here.
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With