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; }
}