Рассмотрим следующий код:
Код: Выделить всё
new Derived("XXX").Test();
public class Base(string name)
{
protected void Log() => Console.WriteLine("Base: " + name);
}
public class Derived(string name) : Base(name)
{
public void Test()
{
base.Log();
Console.WriteLine("Derived: " + name);
}
}
Program.cs(8,42): Предупреждение CS9107: Параметр «имя строки» фиксируется в состоянии включающего типа, и его значение также передается базовому конструктору. Значение также может быть захвачено базовым классом.
Как мне избежать этого предупреждения, следует ли просто подавить его с помощью прагмы? Или есть лучший способ избежать этого? Код написан неправильно? Я не уверен, что вижу альтернативу, кроме как отказаться от основных конструкторов и переписать все так:
Код: Выделить всё
new Derived("XXX").Test();
public class Base
{
protected readonly string _name;
protected Base(string name)
{
_name = name;
}
protected void Log() => Console.WriteLine("Base: " + _name);
}
public class Derived : Base
{
public Derived(string name) : base(name) { }
public void Test()
{
base.Log();
Console.WriteLine("Derived: " + base._name);
}
}
Примечание: Это надуманный, сокращенный пример. из более сложной иерархии классов с использованием объектов конфигурации из Microsoft.Extensions.Configuration, где всем уровням классов необходим доступ к конфигурации.
Подробнее здесь: https://stackoverflow.com/questions/773 ... uctor-para
Мобильная версия