私はそうのように、int型から継承する列挙型でInterlocked.CompareExchange
を使用したい:ref [enum type]をref intに変換するには?
public enum MyEnum : int { A, B }
public class MyClass
{
private static readonly MyEnum s_field = MyEnum.A;
public void Foo()
{
if (Interlocked.CompareExchange(ref s_field, MyEnum.B, MyEnum.A) == MyEnum.A)
{
Console.WriteLine("Changed from A to B");
}
}
}
しかし、CompareExchange
は、参照のみのタイプを選択した値の型(hereを参照)で動作します。 MyEnum
は本当に皮膚の下にint型ですので、私はREF int型としてそれを渡すことができるはずと思った:
// should call CompareExchange(ref int, int, int) overload
Interlocked.CompareExchange(ref s_field, (int)MyEnum.B, (int)MyEnum.A);
しかし、これはどちらか動作するようには思えません。それを渡す前に、キャスティング
Error CS1503: Argument 1: cannot convert from 'ref MyEnum' to 'ref int'
、例えば:私は次のエラーを取得しますref (int)s_field
も役に立ちません。
どうすればこの問題を解決できますか?列挙型でCompareExchange
を使用する方法はありますか、代わりにintを使用する必要がありますか?
enumを使用する具体的な理由はありますか? 「連動している」という言葉は、このように数に制限されています...定数で作業することはできますか(私は知っています...デザインのにおいはしますが)? –
@AndreasNiedermairええ、私はちょうどコードがenumsでよりよく見えると思う。 –
'Interlocked'はAPIの' enum'バリアントを提供しないので、あなたが望むことはできません。 'int'を使う必要があります。 – GreatAndPowerfulOz