Как «правильно» (идиоматически) избегать CS9107 при передаче параметров первичного конструктора в базуC#

Место общения программистов C#
Ответить
Anonymous
 Как «правильно» (идиоматически) избегать CS9107 при передаче параметров первичного конструктора в базу

Сообщение Anonymous »

В C# 12 мы получаем первичные конструкторы для обычных классов.
Рассмотрим следующий код:

Код: Выделить всё

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);
}
}
Это выдает следующее предупреждение для параметра имени строки для первичного конструктора Derived:

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»