Compartilhar via


CA2247: O argumento passado para o construtor TaskCompletionSource deve ser a enumeração TaskCreationOptions em vez da enumeração TaskContinuationOptions

Property Valor
ID da regra CA2247
Título O argumento passado para o construtor TaskCompletionSource deve ser a enumeração TaskCreationOptions em vez da enumeração TaskContinuationOptions
Categoria Usage
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 10 Como aviso

Causa

Construindo um System.Threading.Tasks.TaskCompletionSource com um valor de enumeração System.Threading.Tasks.TaskContinuationOptions em vez de um valor de enumeração System.Threading.Tasks.TaskCreationOptions. Usando o método System.Object.ReferenceEquals para testar um ou mais tipos de valor para igualdade.

Descrição da regra

O tipo TaskCompletionSource tem um construtor que aceita um valor de enumeração System.Threading.Tasks.TaskCreationOptions e outro construtor que aceita um Object. Passar acidentalmente um valor de enumeração System.Threading.Tasks.TaskContinuationOptions em vez de um valor de enumeração System.Threading.Tasks.TaskCreationOptions resultará em chamar o construtor baseado em Object: ele compilará e executará, mas não terá o comportamento pretendido.

Como corrigir violações

Para corrigir a violação, substitua o valor da enumeração System.Threading.Tasks.TaskContinuationOptions pelo valor de enumeração System.Threading.Tasks.TaskCreationOptions correspondente.

// Violation
var tcs = new TaskCompletionSource<int>(TaskContinuationOptions.RunContinuationsAsynchronously);

// Fixed
var tcs = new TaskCompletionSource<int>(TaskCreationOptions.RunContinuationsAsynchronously);

Quando suprimir avisos

Uma violação dessa regra quase sempre destaca um bug no código de chamada, de modo que o código não se comportará como o desenvolvedor pretendia, com o TaskCompletionSource ignorando efetivamente a opção especificada. A única vez que é seguro suprimir o aviso é se o desenvolvedor realmente pretender passar um argumento de estado de objeto em caixa System.Threading.Tasks.TaskContinuationOptions para o TaskCompletionSource

Suprimir um aviso

Para suprimir apenas uma violação, adicione diretivas de pré-processador ao arquivo de origem a fim de desabilitar e, em seguida, reabilitar a regra.

#pragma warning disable CA2247
// The code that's violating the rule is on this line.
#pragma warning restore CA2247

Para desabilitar a regra em um arquivo, uma pasta ou um projeto, defina a severidade como none no arquivo de configuração.

[*.{cs,vb}]
dotnet_diagnostic.CA2247.severity = none

Para desabilitar toda essa categoria de regras, defina a severidade da categoria como none no arquivo de configuração.

[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Usage.severity = none

Para obter mais informações, consulte Como suprimir avisos de análise de código.

Confira também