Generics: Is this improper use? I have a class library in which I'm using generics as below. I'm not sure if it's an improper use or not. So aside from the fact that it works and everything "depends", id like some specific critique on how this usage might fall apart. In particular In wondering about the shadowing of non generic properties with generic counterparts. Is this an accepted practice?

 public interface IPickOrder
    {
        IPickOrderHeader Header { get; }

        ERPListBase&lt;IPickOrderLine&gt; Lines { get; }
    }



 public interface IPickOrder&lt;TPickOrderHeader, TPickOrderLine&gt; : IPickOrder
        where TPickOrderHeader : class, IPickOrderHeader
        where TPickOrderLine : class, IPickOrderLine
    {
        new TPickOrderHeader Header { get; }

       new ERPListBase&lt;TPickOrderLine&gt; Lines { get; }
    }




 public class PickOrder : IPickOrder
    {
        public IPickOrderHeader Header { get; protected set; }

        public ERPListBase&lt;IPickOrderLine&gt; Lines { get; protected set; }

        public PickOrder() { }
    }



   public class PickOrder&lt;TPickOrderHeader, TPickOrderLine&gt; : PickOrder, IPickOrder&lt;TPickOrderHeader, TPickOrderLine&gt;
        where TPickOrderHeader : class, IPickOrderHeader, new()
        where TPickOrderLine : class, IPickOrderLine, new()
    {
        public new TPickOrderHeader Header
        {
            get { return base.Header as TPickOrderHeader; }
            protected set { base.Header = value; }
        }

        public new ERPListBase&lt;TPickOrderLine&gt; Lines { get; protected set; }

        /// &lt;summary&gt;
        /// 
        /// &lt;/summary&gt;
        public PickOrder() : base() { }
    }
I feel you on the "My reasons are more due to preference than need." comment but the inheritance from PickOrder and public new ERPListBase&lt;TPickOrderLine&gt; Lines { get; protected set; }  will confuse somebody best case and really mess things up worst case. While it may still give you that feeling of impending doom here are some suggestions to make this safer while keeping the look and feel you prefer.

Consider implementing the property like so (also for Header)

public new ERPListBase&lt;TPickOrderLine&gt; Lines {
    get {
        // note that you can't control base.Lines so some values may not be of TPickOrderLine
        return new ERPListBase&lt;TPickOrderLine&gt;(base.Lines.OfType&lt;TPickOrderLine&gt;());
    }
    protected set { base.Lines = new new ERPListBase&lt;IPickOrderLine&gt;(value.Cast&lt;IPickOrderLine&gt;()); }
}


Consider not reusing the base class and using explicit interface implementation:

public class PickOrder&lt;TPickOrderHeader, TPickOrderLine&gt; :
    IPickOrder&lt;TPickOrderHeader, TPickOrderLine&gt;
    where TPickOrderHeader : class, IPickOrderHeader, new()
    where TPickOrderLine : class, IPickOrderLine, new()
{
    public TPickOrderHeader Header { get; protected set; }

    IPickOrderHeader IPickOrder.Header { get { return Header; } }

    public ERPListBase&lt;TPickOrderLine&gt; Lines { get; protected set; }

    ERPListBase&lt;IPickOrderLine&gt; IPickOrder.Lines { get { return new ERPListBase&lt;IPickOrderLine&gt;(Lines.Cast&lt;IPickOrderLine&gt;()); } }
}


Whatever you do, avoid storing the same data twice as you may be doing (depending on use) in your current code.