title: Warning about calling overridable auto-property when using generics
body: <p>Consider the following hierarchy:</p>
  
  <pre><code>public abstract class Base&lt;T&gt;
  {
      protected abstract T N { get; set; }
  }
  
  public abstract class Intermediate&lt;T&gt; : Base&lt;T&gt;
  {
      protected override T N { get; set; }
  }
  
  public class Derived : Intermediate&lt;int&gt;
  {
      public Derived() { N = 1; }
      protected override sealed int N { get; set; }
  }
  </code></pre>
  
  <p>Running the Visual Studio 2015 Professional Code Analysis produces the warning</p>
  
  <pre><code>Warning CA2214  'Derived.Derived()' contains a call chain that results in a call to a virtual method defined by the class. Review the following call stack for unintended consequences: 
  
  Derived..ctor()
  Base&lt;T&gt;.set_N(T):Void
  </code></pre>
  
  <p>This is similar to <a href="https://stackoverflow.com/questions/17018569/accessing-an-implemented-abstract-property-in-the-constructor-causes-ca2214-do">another Stack Overflow question</a>, yet different as the property in <code>Derived</code> has been marked as <code>sealed</code>.</p>
  
  <p>On the other hand, the piece of code below, not using any generics, does <em>not</em> produce any warnings:</p>
  
  <pre><code>public abstract class Base
  {
      protected abstract int N { get; set; }
  }
  
  public abstract class Intermediate : Base
  {
      protected override int N { get; set; }
  }
  
  public class Derived : Intermediate
  {
      public Derived() { N = 1; }
      protected override sealed int N { get; set; }
  }
  </code></pre>
  
  <p>Similarly, if I skip the intermediate class and instead derive <code>Derived</code> from <code>Base</code>, the warning disappears, even in the generic case. On the other hand, if I remove the <code>sealed</code> modifier for the latter example, the warning reappears, as expected.</p>
  
  <p>So, is this working as intended in the generic case? And if so, what is an example where one should be careful?</p>