c# - Cast fails from ICollection<TestCastChild> to ICollection<ICastBase> -


this question has answer here:

i'm using reflection property icollection<testcastchild> , cast icollection<icastbase>. testcastchild implement's icastbase. when try cast collection, cast fails. i'm sure i'm missing simple. can't see why fails.

public interface icastbase {     int id { get; set; } }  public interface icastchild : icastbase {     string name { get; set; } }  public abstract class testcastbase : icastbase {     public int id { get; set; } }  public class testcastchild : testcastbase, icastchild {     public string name { get; set; } }  public class testcastparent : testcastbase {     public virtual icollection<testcastchild> children { get; set; } } 

then test:

[testmethod] public void testcast() {     var parent = new testcastparent();     parent.children = parent.children ?? new list<testcastchild>();     parent.children.add(new testcastchild{name = "a"});     parent.children.add(new testcastchild { name = "b"});     parent.children.add(new testcastchild { name = "c"});      var propinfos = parent.gettype().getproperties();     foreach (var propertyinfo in propinfos)     {         if (propertyinfo.propertytype.getmethod("add") != null)         {             var tmpval = propertyinfo.getvalue(parent);             //this evaluates null             var cast1 = tmpval icollection<icastbase>;              //this evaluates null             var cast2 = tmpval icollection<icastchild>;             //this evaluates expected value             var cast3 = tmpval icollection<testcastchild>;         }                    } } 

you cannot cast icollection<derived> icollection<base>, icollection<t> not covariant.

if possible, cast icollection<dog> icollection<mammal> , add cat collection, it's mammal too.

what can do, cast ireadonlycollection<derived> ireadonlycollection<base> ireadonlycollection<out t> covariant. if concrete collection type implements ireadonlycollection<out t> (and list<t> does) work fine, you'll read interface underlying collection. way, type safety still preserved.

note can use ireadonlylist<out t>, inherits ireadonlycollection<out t> , adds indexer.


Comments

Popular posts from this blog

android - Gradle sync Error:Configuration with name 'default' not found -

java - Andrioid studio start fail: Fatal error initializing 'null' -

html - jQuery UI Sortable - Remove placeholder after item is dropped -