C# 关于在使用泛型时调用可重写自动属性的警告

C# 关于在使用泛型时调用可重写自动属性的警告,c#,visual-studio,generics,inheritance,code-analysis,C#,Visual Studio,Generics,Inheritance,Code Analysis,考虑以下层次结构: public abstract class Base<T> { protected abstract T N { get; set; } } public abstract class Intermediate<T> : Base<T> { protected override T N { get; set; } } public class Derived : Intermediate<int> {

考虑以下层次结构:

public abstract class Base<T>
{
    protected abstract T N { get; set; }
}

public abstract class Intermediate<T> : Base<T>
{
    protected override T N { get; set; }
}

public class Derived : Intermediate<int>
{
    public Derived() { N = 1; }
    protected override sealed int N { get; set; }
}
类似地,如果我跳过中间类,而是从
Base
派生
Derived
,即使在一般情况下,警告也会消失。另一方面,如果我删除后一个示例中的
sealed
修饰符,则警告会重新出现,正如预期的那样


那么,这在一般情况下是否按预期工作?如果是这样的话,我们应该注意的例子是什么?

很有趣。。。无法解释,但想坚持它是“泛型”,而不是“模板”。。。。C++模板与C语言的泛型非常不同。让我更新一下措辞。类似的问题,可能会有帮助:@JohnKoerner:谢谢你的参考。看起来这确实是一个假阳性。对于此查询,GitHub问题:
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<T>.set_N(T):Void
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; }
}