.NET 4.0 の Enum.TryParse がスレッド セーフかどうかを調べようとしています。
ソース コード (逆コンパイル) は次のとおりです。
[SecuritySafeCritical]
public static bool TryParse<TEnum>(string value, bool ignoreCase, out TEnum result) where TEnum : struct
{
result = default(TEnum); /// (*)
Enum.EnumResult enumResult = default(Enum.EnumResult);
enumResult.Init(false);
bool result2;
if (result2 = Enum.TryParseEnum(typeof(TEnum), value, ignoreCase, ref enumResult))
{
result = (TEnum)enumResult.parsedEnum;
}
return result2;
}
私にとって問題と思われるのは、次の行です。
result = default(TEnum); /// (*)
結果がデフォルト値に設定された直後で、解析された値に設定される前に、別のスレッドが結果にアクセスした場合はどうなるでしょうか?
[編集] Zoidberg の回答に続いて、質問を少し言い換えたいと思います。
問題は、Enum.TryParse が「トランザクション」(またはアトミック) であるかどうかだと思います。
静的フィールドがあり、それを Enum.TryParse に渡すとします。
public static SomeEnum MyField;
....
Enum.TryParse("Value", out MyField);
ここで、TryParse が実行されているときに、別のスレッドが MyField にアクセスします。TryParse は MyField の値を SomeEnum のデフォルト値にしばらく変更し、それから解析された値に設定します。
これは必ずしも私のコードのバグではありません。Enum.TryParse が MyField を解析された値に設定するか、まったく触れず、一時フィールドとして使用しないことを期待します。