0

列挙型で何かを行い、それを返す拡張機能を取得したとしましょう。

public static T Do<T>(this Enum e) where T : struct
{
    // Do something.
    return // e? .. (T)e? .. or (T)(object)e? ;
}

では、この例でコードを正常にビルドして実行するには、何を返す必要がありますか。

Roles role = Roles.Admin | Roles.Moderator;
role.Do<Roles>().SomethingElse().AndMore<Roles>().Etc<int>();

__

return (T)e;

http://pasteboard.s3.amazonaws.com/images/1349685696025173.png

__

return e;

http://pasteboard.s3.amazonaws.com/images/1349685753912110.png

__

return (T)(object)e;

実際には動作しますが、ボックス化してからボックス化解除します。

4

3 に答える 3

1
    public static T Do<T>(this Enum e) where T : struct
    {
        return (T) Convert.ChangeType(e, typeof(T));
    }
于 2012-10-08T08:48:15.473 に答える
1

ジェネリックに Enum 制約を配置できないため、これは注意が必要です。

詳細と考えられる回避策については、この記事をご覧ください。

http://msmvps.com/blogs/jon_skeet/archive/2009/09/10/generic-constraints-for-enums-and-delegates.aspx

于 2012-10-08T08:51:03.710 に答える
0

Closure の数学的構造に従わなければなりません。
ウィキペディアはこれをよく説明しています: Closrue

短い文で:
あなたの場合、次の関数が入力パラメーターとして期待するものを返す必要があります。

于 2012-10-08T08:41:58.050 に答える