Compartilhar via


Erros e avisos relacionados ao modificador params em parâmetros de métodos

Há alguns erros relacionados à instrução lock e sincronização de thread:

  • CS0225: O parâmetro params deve ser uma matriz unidimensional ou ter um tipo de coleção válido
  • CS0231: O parâmetro params deve ser o último parâmetro em uma lista de parâmetros formal.
  • CS0466: 'method1' não deve ter um parâmetro params, pois 'method2' não tem
  • CS0674: Não use System.ParamArrayAttribute ou System.ParamArrayAttribute/System.Runtime.CompilerServices.ParamCollectionAttribute. Em vez disso, use a palavra-chave params.
  • CS0758: As duas declarações de método parcial devem usar um parâmetro params ou nenhuma delas pode usar um parâmetro params
  • CS1104: Uma matriz de parâmetros não pode ser usada com o modificador this em um método de extensão.
  • CS1611: O parâmetro params não pode ser declarado como em ref ou out
  • CS1670: params não é válido neste contexto
  • CS1751: Não é possível especificar um valor padrão para uma matriz de parâmetros.
  • CS9218: Os argumentos de tipo para o método não podem ser inferidos a partir do uso porque um argumento com tipo dinâmico é usado e o método possui um parâmetro de coleção de parâmetros não matrizes. Tente especificar os argumentos de tipo explicitamente.
  • CS9223: A criação de uma coleção de parâmetros resulta em uma cadeia infinita de invocação do construtor.
  • CS9224: O método não pode ser menos visível do que o membro com a coleção de parâmetros.
  • CS9225: O construtor deixa o membro necessário não inicializado.
  • CS9227: O tipo não contém uma definição para um método de instância Add adequado.
  • CS9228: O tipo de coleção de parâmetros não matrizes deve ter um construtor aplicável que possa ser chamado sem argumentos.

Regras de declaração de métodos

Os erros a seguir indicam o uso de um modificador params em um parâmetro quando o modificador params não é permitido nesse contexto:

  • CS0231: Um parâmetro params deve ser o último parâmetro em uma lista formal de parâmetros.
  • CS1104: Uma matriz de parâmetros não pode ser usada com o modificador this em um método de extensão.
  • CS1611: O parâmetro params não pode ser declarado como em ref ou out
  • CS1670: params não é válido neste contexto
  • CS1751: Não é possível especificar um valor padrão para uma matriz de parâmetros.

O compilador aplica as seguintes regras ao uso do modificador params em um parâmetro de método:

  • O modificador params é permitido somente no último parâmetro em uma lista formal de parâmetros. Isso inclui todos os parâmetros com um valor padrão.
  • Não é possível incluir um argumento padrão para o parâmetro quando o modificador params é usado.
  • O modificador params não pode ser aplicado ao parâmetro de referência. Um parâmetro de referência é aquele com o modificador in, ref readonly, ref ou out.
  • O modificador params não pode ser combinado com o modificador this em um método de extensão.
  • O modificador params não pode ser usado em um operador sobrecarregado.

Em versões anteriores ao C# 12, o modificador params não pode ser usado no parâmetro de um método anônimo ou expressão lambda.

Regras do tipo de parâmetro e argumento

Os erros a seguir indicam que o tipo do parâmetro usado com params é inválido:

  • CS9218: Os argumentos de tipo para o método não podem ser inferidos a partir do uso porque um argumento com tipo dinâmico é usado e o método tem um parâmetro de coleção de parâmetros não matrizes. Tente especificar os argumentos de tipo explicitamente.
  • CS0225: O parâmetro params deve ser uma matriz unidimensional ou ter um tipo de coleção válido
  • CS9227: O tipo não contém uma definição para um método de instância Add adequado.
  • CS9228: O tipo de coleção de parâmetros não matrizes deve ter um construtor aplicável que possa ser chamado sem argumentos.

Em versões anteriores ao C# 13, o modificador params é permitido apenas em matrizes unidimensionais. Nenhum outro tipo era válido.

A partir do C# 13, qualquer tipo de coleção válido pode ser usado. Entretanto, algumas restrições permanecem. O tipo de coleção deve seguir as mesmas regras que o destino de uma expressão de coleção.

Outros erros de params

Os erros a seguir indicam outros problemas com o uso do modificador params:

  • CS0466: 'method1' não deve ter um parâmetro params, pois 'method2' não tem
  • CS0674: Não use System.ParamArrayAttribute ou System.Runtime.CompilerServices.ParamCollectionAttribute. Em vez disso, use a palavra-chave params.
  • CS0758: As duas declarações de método parcial devem usar um parâmetro params ou nenhuma delas pode usar um parâmetro params
  • CS9223: A criação de uma coleção de parâmetros resulta em uma cadeia infinita de invocação do construtor.
  • CS9224: O método não pode ser menos visível do que o membro com a coleção de parâmetros.
  • CS9225: O construtor deixa o membro necessário não inicializado.

Um método que implementa uma interface deve incluir o modificador params se e somente se o membro da interface tiver o modificador params. Da mesma forma, ambas as declarações de um método partial devem incluir o modificador params, ou nenhuma pode incluir o modificador params.

Você deve usar o modificador params. Não é possível aplicar os atributos equivalentes, seja System.ParamArrayAttribute ou System.Runtime.CompilerServices.ParamCollectionAttribute.

O compilador gera um dos três últimos erros da lista anterior quando o código gerado para criar o tipo de coleção é inválido:

  • O compilador emite CS9223 quando o código emitido para criar a coleção também contém uma coleção de parâmetros do mesmo tipo. Normalmente, o método Add recebe uma coleção params do mesmo tipo.
  • O compilador emite CS9224 quando o método Create para o tipo de coleção é menos acessível do que o método que recebe o parâmetro params do tipo de coleção.
  • O compilador emite CS9225 quando o tipo de coleção tem um membro obrigatório e o construtor sem parâmetro não inicializa esse membro e tem o System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute no construtor sem parâmetros.

Confira também