.NET 4.0 Generic Invariant, Covariant, Contravariant -


here's scenario faced with:

public abstract class record { }   public abstract class tablerecord : record { }   public abstract class lookuptablerecord : tablerecord { }   public sealed class userrecord : lookuptablerecord { }   public interface idataaccesslayer<trecord>      trecord : record { }   public interface itabledataaccesslayer<ttablerecord> : idataaccesslayer<ttablerecord>      ttablerecord : tablerecord { }   public interface ilookuptabledataaccesslayer<tlookuptablerecord> : itabledataaccesslayer<tlookuptablerecord>      tlookuptablerecord : lookuptablerecord { }   public abstract class dataaccesslayer<trecord> : idataaccesslayer<trecord>      trecord : record, new() { }   public abstract class tabledataaccesslayer<ttablerecord> : dataaccesslayer<ttablerecord>, itabledataaccesslayer<ttablerecord>      ttablerecord : tablerecord, new() { }   public abstract class lookuptabledataaccesslayer<tlookuptablerecord> : tabledataaccesslayer<tlookuptablerecord>, ilookuptabledataaccesslayer<tlookuptablerecord>      tlookuptablerecord : lookuptablerecord, new() { }   public sealed class userdataaccesslayer : lookuptabledataaccesslayer<userrecord> { } 

now when try cast userdataaccesslayer it's generic base type itabledataaccesslayer<tablerecord>, compiler complains cannot implicitly convert type.

when try , use in or out keywords in interface declaration generic parameters, compiler complains invalid variance: type parameter must invariantly valid.

i have following abstract class:

public abstract class fileprocessor : idisposable {     protected abstract itabledataaccesslayer<tablerecord> createtabledataaccesslayer(); } 

and sample concrete implementation follows:

public class userfileprocessor : fileprocessor {             protected override itabledataaccesslayer<tablerecord> createtabledataaccesslayer()         {             return new userdataaccesslayer();         } } 

return new userdataaccesslayer(); compiler complaining.

as far know need specify out keyword interface if want use covariance.

http://geekswithblogs.net/newthingsilearned/archive/2009/09/30/covariance-in-.net-4.0.aspx


Comments

Popular posts from this blog

javascript - Enclosure Memory Copies -

php - Replacing tags in braces, even nested tags, with regex -