Eu trabalho com uma plataforma que usa intensamente reflexão e geração de código para inicializar membros de certos tipos especiais. Parece algo assim:
public class MyGraph : PXGraph<MyGraph>
{
public PXSelect<DBTable> view;
}
Quero adicionar análise de tipos de referência anuláveis ao meu código. No entanto, não consigo encontrar uma solução elegante que evite vários avisos sobre campos não anuláveis não inicializados. Eles são exibidos em campos ou no construtor de tipo. A plataforma os inicializa
Eu sei que posso suprimir avisos da análise anulável. No entanto, não gosto da aparência. Não gosto de pragmas porque eles desorganizam o código, e não gosto ainda mais de atributos de supressão.
Não gosto da seguinte declaração porque me parece um absurdo:
public class MyGraph : PXGraph<MyGraph>
{
public PXSelect<DBTable> view = null!; // or = default!
}
Também tentei atributos anuláveis sem muito benefício.
Tentei usar a required
palavra-chave assim:
public class MyGraph : PXGraph<MyGraph>
{
public required PXSelect<DBTable> view;
}
Gosto mais dessa declaração, mas recebo erro do compilador sobre campo não inicializado.
Existe uma maneira de suprimir avisos do compilador de uma forma mais sofisticada? Posso usar o Roslyn para afetar de alguma forma o diagnóstico do compilador?
Como @marc-gravell mencionou, há uma
DiagnosticSuppressor
API no Roslyn. Eu a usei para coisas semelhantes. Ela funciona até mesmo se você adicionar o analisador com o supressor ao seu projeto como um pacote nuget.Há uma desvantagem, porém, o Rider IDE não suporta essa funcionalidade do Roslyn. Então, use-o por sua conta e risco.
Quanto ao código, ele deve ficar assim:
Você mencionou Roslyn; se você estiver feliz em chegar ao nível de escrever seu próprio analisador que pode identificar os cenários permitidos, então: o que você está procurando é
DiagnosticSuppressor
.Observe que somente avisos (não erros) podem ser suprimidos.