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 8 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