動くコード図鑑技術記事現場の渡り方キャリア論すべての記事About
C#

パターン3: Enum.TryParse + IsDefined — 2段ガードで数字文字列の罠も封じる

出典: C# TryParse の正解 — int.TryParse / DateTime.TryParse / Enum.TryParse で業務SE が踏む3つのハマり3パターンのコード比較 (動作確認つき) / パターン3: Enum.TryParse + IsDefined — 2段ガードで数字文字列の罠も封じる

パターン3: Enum.TryParse + IsDefined — 2段ガードで数字文字列の罠も封じる (csharp)#b310074d2048
public enum Status { Active = 1, Inactive = 2, Pending = 3 }
 
string[] inputs = { "Active", "active", "Pending", "Unknown", "0", "99", "" };
 
// NG パターン: Enum.TryParse 単独 (数字文字列が定義外でも true になる)
Console.WriteLine("--- Enum.TryParse 単独 (危険) ---");
foreach (var s in inputs) {
    var ok = Enum.TryParse<Status>(s, ignoreCase: true, out var v);
    Console.WriteLine($"  '{s}' → ok={ok,-5} value={v} (定義値か: {Enum.IsDefined(typeof(Status), v)})");
}
 
// OK パターン: TryParse + IsDefined の2段ガード
Console.WriteLine("--- Enum.TryParse + IsDefined (2段ガード) ---");
static bool TryParseStrict<T>(string s, out T value) where T : struct, Enum
    => Enum.TryParse<T>(s, ignoreCase: true, out value) && Enum.IsDefined(typeof(T), value);
 
foreach (var s in inputs) {
    if (TryParseStrict<Status>(s, out var v)) {
        Console.WriteLine($"  '{s}' → OK ({v})");
    } else {
        Console.WriteLine($"  '{s}' → NG (定義外 or パース不可)");
    }
}
▸ 実行ボタンで結果を表示
  • id: #b310074d2048
  • lines: 23
  • extracted: 2026-06-10
  • captured: 2026-06-04

Source収録記事

この snippet は記事の「3パターンのコード比較 (動作確認つき) / パターン3: Enum.TryParse + IsDefined — 2段ガードで数字文字列の罠も封じる」セクションに登場する。コードの前後の文脈・ハマりどころの解説は記事本文で。

同じ記事から

4
図鑑トップ