Por que o ReSharper está me julgando por este código?
private Control GetCorrespondingInputControl(SupportedType supportedType, object settingValue)
{
this.ValidateCorrespondingValueType(supportedType, settingValue);
switch(supportedType)
{
case SupportedType.String:
return new TextBox { Text = (string)settingValue };
case SupportedType.DateTime:
return new MonthPicker { Value = (DateTime)settingValue, ShowUpDown = true };
default:
throw new ArgumentOutOfRangeException(string.Format("The supported type value, {0} has no corresponding user control defined.", supportedType));
}
}
private void ValidateCorrespondingValueType(SupportedType supportedType, object settingValue)
{
Type type;
switch(supportedType)
{
case SupportedType.String:
type = typeof(string);
break;
case SupportedType.DateTime:
type = typeof(DateTime);
break;
default:
throw new ArgumentOutOfRangeException(string.Format("The supported type value, {0} has no corresponding Type defined.", supportedType));
}
string exceptionMessage = string.Format("The specified setting value is not assignable to the supported type, [{0}].", supportedType);
if(settingValue.GetType() != type)
{
throw new InvalidOperationException(exceptionMessage);
}
}
O parâmetro "settingValue" do segundo método ValidateCorrespondingValueType fica esmaecido com a seguinte mensagem do ReSharper: "O parâmetro 'settingValue' é usado apenas para verificações de pré-condição."
c#
resharper
preconditions
Cadáver
fonte
fonte
exceptionMessage
para oif
-block :)Respostas:
Não está julgando, está tentando ajudar :)
Se ReSharper perceber que um parâmetro é usado apenas como uma verificação para lançar uma exceção, ele o tornará cinza, indicando que você não o está usando para trabalho "real". Provavelmente é um erro - por que passar um parâmetro que você não vai usar? Geralmente indica que você o usou em uma pré-condição, mas depois se esqueceu (ou não precisa mais) usá-lo em outro lugar no código.
Como o método é um método de asserção (ou seja, tudo o que ele faz é afirmar que é válido), você pode suprimir a mensagem marcando o
ValidateCorrespondingValueType
como um método de asserção, usando os atributos de anotação do ReSharper , especificamente o[AssertionMethod]
atributo:fonte
settingValue
não pode ser uma pré- condição, uma vez que o que está sendo verificado não é conhecido até que algum trabalho tenha sido feito dentro do corpo do método![AssertionMethod]
.Curiosamente, o ReSharper recua se você usar a nova
nameof
funcionalidade em C # 6:fonte
O seguinte corrige o problema (no ReSharper 2016.1.1, VS2015), mas não tenho certeza se ele resolve o problema 'certo'. Em qualquer caso, mostra a ambiguidade na mecânica do ReSharper em relação a este tópico:
Isso produz o aviso:
Mas isso não:
É interessante que o código equivalente (a inversão foi feita por ReSharper: D) dá resultados diferentes. Parece que a correspondência de padrões simplesmente não pega a segunda versão.
fonte
Minha solução preferida para esse problema é fazer o resharper pensar que o parâmetro é usado. Isto tem uma vantagem sobre usando um atributo como
UsedImplicitly
porque se alguma vez você não parar de usar esse parâmetro, ReSharper irá começar avisando novamente. Se você usar um atributo, o resharper também não detectará avisos reais futuros.Uma maneira fácil de fazer o resharper pensar que o parâmetro está sendo usado é substituindo
throw
por um método. Então, em vez de ......você escreve:
Isso é muito bem autodocumentado para futuros programadores e o resharper para de reclamar.
A implementação de ThrowPreconditionViolation é trivial:
Um método de extensão no Exception é a poluição do namespace, mas é bastante contido.
fonte
[UsedImplicitly]
, eu não queria usar[AssertionMethod]
como não era, e usado implicitamente soa mais preciso no meu caso (eu estava passando um valor para um retorno de chamada em um construtor e retornando o objeto construído).Outros já responderam à pergunta, mas ninguém mencionou as seguintes maneiras de desligar o aviso.
Adicione isso acima da assinatura do método para desativá-lo apenas para aquele método:
Adicione isso acima da declaração de classe para desativá-lo para todo o arquivo:
fonte