※アイキャッチ画像は、話題の生成AIで作成してみました。
public record UserType
{
public static readonly UserType NormalUser = new(0);
public static readonly UserType PremiumUser = new(1);
private UserType (byte value ) => Value = value;
public byte Value {get;}
public static UserType Parse(byte value) =>
value switch
{
0 => new UserType(value),
1 => new UserType(value)
_ => // throw Exception
};
例えばこんなValueObjectがあるとしたとき、これは定数として定義されていないので普通通りやるとswitch式の条件に使うことができない。
public string hogehoge()
{
UserType t = repository.FindUserType();
return t switch {
UserType.NormalUser => "無料会員",
UserType.PremiumUser => "プレミアム会員",
_ => "会員ではない"
};
「ValueObjectなので、定数っぽく使ってswitchに載せたい」というのが書き手の意図なわけだけれども、C#の文法上これは許されていなくて、この書き方ではコンパイルエラーになってしまう。
そこで、最近のC#に導入されている型のパターンマッチングと組み合わせて、not null when~を使うとそれっぽく書くことができる。
return t switch
{
not null when t == UserType.NormalUser => "無料会員",
not null when t == UserType.PremiumUser => "プレミアム会員",
_ => "会員ではない"
};
項目が増えるとnot nullの羅列になるので、ここのところはシンタックスシュガー的なアシストが欲しいなと思う今日このごろ。(あるいは、もっと良い書き方を知りたい)