Я хочу использовать 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
действительно является ИНТ под кожей, я думал, что я должен быть в состоянии передать его как исх междунар:
// 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
с перечислениями, или я должен использовать ints вместо этого?
Есть ли какая-то конкретная причина, по которой вы работаете с перечислениями? «Блокировка» ограничена номерами в этом, что угадывает ... Можете ли вы работать с константами (я знаю, ... запах дизайна, хотя)? –
@AndreasNiedermair Да, я просто думаю, что код выглядит лучше с перечислениями. –
Вы не можете делать то, что хотите, поскольку 'Interlocked' не предоставляет вариант API-интерфейса enum. Вы должны использовать 'int'. – GreatAndPowerfulOz