1. ホーム
  2. c#

[解決済み] ReSharperの好奇心。「パラメータは前提条件のチェックにのみ使用されます。

2022-05-17 02:01:17

質問

なぜReSharperはこのコードを判定するのでしょうか?

    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);
        }
    }

2番目のメソッドValidateCorrespondingValueTypeの"settingValue"パラメータは、ReSharperによって以下のメッセージとともにグレーアウトされています。 "パラメータ 'settingValue' は、前提条件のチェックにのみ使用されます。

解決方法は?

判断しているのではなく、助けようとしているのです :)

ReSharperは、パラメータが例外を投げるためのチェックにしか使われていないと判断した場合、そのパラメータを実際に使っていないことを示すために、グレーアウトさせます。これは間違いである可能性が高いです。なぜ使う予定のないパラメータを渡すのでしょうか?通常、これは事前条件で使用した後、コードの他の場所で使用することを忘れている (または、もはや必要ない) ことを示します。

このメソッドはアサーションメソッドなので (つまり、このメソッドが行うのは有効であることを表明することだけです)、 このメッセージを抑制するために ValidateCorrespondingValueType をアサーションメソッドとしてマークし、ReSharper の アノテーション属性 を、具体的には [AssertionMethod] 属性があります。

[AssertionMethod]
private void ValidateCorrespondingValueType(SupportedType supportedType, object settingValue)
{
  // …
}