◆結論

nameofはコンパイル時に評価されるでよ。かたやToStringとか文字列リテラルはdynamicだでよ。

◆経緯

こういうEnumがあったとして。

    public enum Animal
    {
        Duck,
        Cock,
        Dick
    }

    public enum Action
    {
        Kick,
        Hack,
        Lick,
        Suck,
        Pick,
        Pack,
        Fuck
    }

こういったコードを書くと

[Authorize(Policy = $"{Animal.Dick}:{Action.Kick}")]

以下のように怒られる。

CS0182 属性引数は、定数式、typeof 式、または属性パラメーター型の配列の作成式でなければなりません。

※英語

An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type

ぎゃびび!(激怒)

◆意味

書いてあるままだけど、定数じゃないといかん。つまり、コンパイル時に決定されていないといけない。

「「「されてるぢゃん!!!!」」」

つって、C#の文字列リテラルって、内部的にはToStringしてるだけなんすね。だから怒られる。

◆解決

nameofを使おうよ。nameofはコンパイル時に評価してくれるよ。typeofもそうだよ。

こうなるよ。

[Authorize(Policy = nameof(Animal.Dick) + ":" + nameof(Action.Kick))]

なーん。きったねぇコード。ぶっコ抜w

◆結論(にかいめ)

俺がマスクをするのは唇が割れるからです。