0

この質問からコードを借りる複数の列挙型フラグが設定されているかどうかを確認するにはどうすればよいですか? このテストを実行する一般的な拡張機能を実装しようとしました。

私の最初の試みは次のとおりでした。

public static bool ExactlyOneFlagSet(this Enum enumValue)
{
    return !((enumValue & (enumValue - 1)) != 0);
}

その結果、

演算子 '-' は、型 'System.Enum' および 'int' のオペランドには適用できません

わかりましたので、このようなことを試してみようと思いました

public static bool ExactlyOneFlagSet<T>(this T enumValue) where T : struct, IConvertible
{
    return !(((int)enumValue & ((int)enumValue - 1)) != 0);
}

その結果、

タイプ 'T' を 'int' に変換できません

この動作について読んだ後、これも理にかなっていますが、この拡張メソッドをどのように実装できますか。誰でも親切に助けてくれますか?

4

1 に答える 1

2

IConvertibleのT実装を制限しているため、単にToInt32を呼び出すことができます。

public static bool ExactlyOneFlagSet<T>(this T enumValue)
    where T : struct, IConvertible
{
    int v = enumValue.ToInt32(null);
    return (v & (v - 1)) == 0;
}
于 2012-11-16T04:17:16.773 に答える