実現したいこと
前提
文字列で与えられたコード(数値)を定義されている列挙型に変換する処理を書いています。
いろんな列挙型に対応する必要があるのでジェネリックメソッドを定義しています。
戻り値がnull許容値型ならdefaultでnullが返るものだと思っていたんですが、列挙型は0で返ってしまいます。
列挙型の値に0を定義しているものがあり、これではまずいのでどうしてもnullで返したいです。
戻り値nullはそもそも書けなくてどうしたらいいんだって感じです。
該当のソースコード
C#
1namespace Main;2 3class Program 4{5 public static void Main()6 {7 var fruitsList = new List<Fruits?>();8 for(var i = 0; i < 10; i++)9 {10 fruitsList.Add(GetEnum<Fruits>(i.ToString()));11 }12 13 var nameList = new List<Name?>();14 for (var i = 0; i < 10; i++)15 {16 nameList.Add(GetEnum<Name>(i.ToString()));17 }18 19 var fruitsList2 = new List<Fruits?>();20 for (var i = 0; i < 10; i++)21 {22 fruitsList2.Add(GetStruct<Fruits>(i.ToString()));23 }24 25 var nameList2 = new List<Name?>();26 for (var i = 0; i < 10; i++)27 {28 nameList2.Add(GetStruct<Name>(i.ToString()));29 }30 31 var dates = new List<DateTime?>();32 for (var i = 0; i < 10; i++)33 {34 dates.Add(GetStruct<DateTime>(i.ToString()));35 }36 37 }38 39 enum Fruits40 {41 Apple = 0,42 Banana,43 Orange,44 }45 46 enum Name47 {48 John = 1,49 Mike,50 Kate,51 Jully 52 }53 54 // 数値の文字列をT型に変換する55 public static T? GetEnum<T>(string? s) where T : Enum 56 {57 if(int.TryParse(s, out var value))58 {59 var temp = (T)(object)value;60 61 if(Enum.IsDefined(typeof(T), temp))62 {63 return temp;64 }65 66 }67 68 return default;69 }70 71 // 数値の文字列をT型に変換する72 public static T? GetStruct<T>(string? s) where T : struct73 {74 Type type = typeof(T);75 if (!type.IsEnum) throw new ArgumentException(nameof(T));76 77 if (int.TryParse(s, out var value))78 {79 var temp = (T)(object)value;80 81 if (Enum.IsDefined(typeof(T), temp))82 {83 return temp;84 }85 86 }87 88 return default;89 }90}91 92
試したこと
あと型パラメータ制約をstructにしてnullを返す方法を見つけたんですけど、これでもいいのか見てほしいです。
0 コメント