116

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」パラメーターは、R​​eSharper によって次のメッセージでグレー表示されます。「パラメーター 'settingValue' は前提条件チェックにのみ使用されます。」

4

7 に答える 7

9

以下は問題を修正します(ReSharper 2016.1.1、VS2015)が、「正しい」問題を解決するかどうかはわかりません。いずれにせよ、このトピックに関する ReSharper のメカニズムのあいまいさを示しています。

これにより、次の警告が表示されます。

    private void CheckForNull(object obj)
    {
        if (ReferenceEquals(obj, null))
        {
            throw new Exception();
        }
    }

しかし、これはしません:

    private void CheckForNull(object obj)
    {
        if (!ReferenceEquals(obj, null))
        {
            return;
        }
        throw new Exception();
    }

同等のコード (反転は ReSharper によって行われました:D) が異なる結果をもたらすことは興味深いことです。パターン マッチングは単純に 2 番目のバージョンを検出しないようです。

于 2016-05-30T11:34:28.140 に答える
6

この問題に対する私の推奨する解決策は、パラメータが使用されていると resharper に思わせることです。これには、属性を使用するよりも利点がありUsedImplicitlyます 。そのパラメーターの使用をやめると、resharper が再び警告を発し始めるからです。属性を使用すると、resharper は将来の実際の警告もキャッチしません。

resharper にパラメーターが使用されていると思わせる簡単な方法はthrow、メソッドに置き換えることです。代わりに...

if(myPreconditionParam == wrong)
    throw new Exception(...);

...あなたが書く:

if(myPreconditionParam == wrong)
    new Exception(...).ThrowPreconditionViolation();

これは、将来のプログラマーにとって適切な自己文書化であり、resharper は泣き言を言うのをやめます。

ThrowPreconditionViolation の実装は簡単です。

public static class WorkAroundResharperBugs 
{
    //NOT [Pure] so resharper shuts up; the aim of this method is to make resharper 
    //shut up about "Parameter 'Foobaar' is used only for precondition checks" 
    //optionally: [DebuggerHidden]
    public static void ThrowPreconditionViolation(this Exception e)
    {
        throw e;
    }
}

Exception の拡張メソッド名前空間の汚染ですが、かなり含まれています。

于 2016-02-05T11:12:42.910 に答える