.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
Post a Comment