Following snippet wouldn't compile. With following error:
Cannot implicitly convert type 'Container<ChildClass>' to 'Container<BaseClass>'
class BaseClass {}
class ChildClass : BaseClass {}
class Container<T> where T : BaseClass {}
class Program {
static void Main() {
// why doesn't this work?
Container<BaseClass> obj = new Container<ChildClass>();
}
}
Is this by design? If it is, what is the reason?
(made wiki, in case of dups)
C# (3.0) doesn't support covariance of lists etc. C# 4.0 will support limited [co|contra]variance, but still not lists.
The problem is that with:
Container<BaseClass> obj = new Container<ChildClass>();
I could do:
obj.Add(new SomeOtherSubclass()); // SomeOtherSubclass : BaseClass
which would compile, but not work.
This behaviour is supported for arrays, but largely for historic reasons.
Yo,
If you want the killer article on covariance/contravariance on C#, check out the eric lippert blog, "fabulous adventures in coding". First, this is my favortie blog's name, and second eric wrote the best sequence of articles on (co|contra)variance:
This is as good as Breaking Bad.
This is what's knows as covariance / contravariance which isn't available as of C# 3.0. It will be somewhat available in C# 4.0. Here's some info:
http://reddevnews.com/articles/2009/05/01/generic-covariance-and-contravariance-in-c-40.aspx
Cannot implicitly convert type
Container<ChildClass>
toContainer<BaseClass>
There is a very common mis-conception that MyClass<Child>
inherits from MyClass<Base>
.
来源:https://stackoverflow.com/questions/981570/c-no-implict-conversion-from-classchild-to-classbase