C#: No implict conversion from Class to Class<Base>

后端 未结 4 1397
失恋的感觉
失恋的感觉 2020-12-03 20:10

Following snippet wouldn\'t compile. With following error:

Cannot implicitly convert type \'Container\' to \'Container

相关标签:
4条回答
  • 2020-12-03 20:40

    (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.

    0 讨论(0)
  • 2020-12-03 20:49

    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:

    http://blogs.msdn.com/ericlippert/archive/2007/10/16/covariance-and-contravariance-in-c-part-one.aspx

    This is as good as Breaking Bad.

    0 讨论(0)
  • 2020-12-03 20:50

    Cannot implicitly convert type Container<ChildClass> to Container<BaseClass>

    There is a very common mis-conception that MyClass<Child> inherits from MyClass<Base>.

    0 讨论(0)
  • 2020-12-03 20:52

    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

    0 讨论(0)
提交回复
热议问题