1. ホーム
  2. c#

[解決済み】ReSharperが警告を出す。"汎用型の静的フィールド"

2022-04-01 02:57:45

質問

public class EnumRouteConstraint<T> : IRouteConstraint
    where T : struct
{
    private static readonly Lazy<HashSet<string>> _enumNames; // <--

    static EnumRouteConstraint()
    {
        if (!typeof(T).IsEnum)
        {
            throw new ArgumentException(
                Resources.Error.EnumRouteConstraint.FormatWith(typeof(T).FullName));
        }

        string[] names = Enum.GetNames(typeof(T));
        _enumNames = new Lazy<HashSet<string>>(() => new HashSet<string>
        (
            names.Select(name => name), StringComparer.InvariantCultureIgnoreCase
        ));
    }

    public bool Match(HttpContextBase httpContext, Route route, 
                        string parameterName, RouteValueDictionary values, 
                        RouteDirection routeDirection)
    {
        bool match = _enumNames.Value.Contains(values[parameterName].ToString());
        return match;
    }
}

これは間違っているのでしょうか?私は、これには実際に static readonly フィールドがあります。 EnumRouteConstraint<T> を、偶然にもインスタンス化することができました。

解決方法は?

ジェネリック型に静的フィールドを持つことは、型引数の組み合わせごとに本当に1つのフィールドを取得することが分かっている限り、問題ないでしょう。私の推測では、R#は、あなたがそのことに気づいていない場合に備えて警告しているだけだと思います。

その例を挙げましょう。

using System;

public class Generic<T>
{
    // Of course we wouldn't normally have public fields, but...
    public static int Foo;
}

public class Test
{
    public static void Main()
    {
        Generic<string>.Foo = 20;
        Generic<object>.Foo = 10;
        Console.WriteLine(Generic<string>.Foo); // 20
    }
}

ご覧の通りです。 Generic<string>.Foo とは別のフィールドです。 Generic<object>.Foo - これらは別々の値を保持しています。