我希望将Interlocked.CompareExchange与继承自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只适用于引用类型和选择值类型(参见这里 )。由于MyEnum实际上是皮肤下的int,所以我认为我应该能够将它作为ref传递:
// should call CompareExchange(ref int, int, int) overload
Interlocked.CompareExchange(ref s_field, (int)MyEnum.B, (int)MyEnum.A);然而,这似乎也不起作用。我得到以下错误:
错误CS1503:参数1:无法从'ref MyEnum‘转换为'ref int’
在传入之前进行强制转换(例如ref (int)s_field )也没有帮助。
我怎么才能解决这个问题?是否有任何方法将CompareExchange与枚举一起使用,或者必须使用ints来代替?
发布于 2017-06-19 03:50:51
我相信现在Unsafe类是可能的,它是在.NET核心中引入的。运行以下命令将包含类的包安装到应用程序中:
Install-Package System.Runtime.CompilerServices.Unsafe然后你就可以做Interlocked.CE(ref Unsafe.As<MyEnum, int>(ref s_field), (int)MyEnum.B, (int)MyEnum.A)了。请注意,这需要C# 7语言对ref返回的支持,因此您需要使用VS2017或更高版本。
发布于 2016-07-07 13:13:38
你想用工会吗?
public enum MyEnum : int { A, B }
[StructLayout(LayoutKind.Explicit)]
struct IntEnumUnion
{
[FieldOffset(0)]
public MyEnum Enum;
[FieldOffset(0)]
public int Int;
}
private static IntEnumUnion s_field;s_field.Enum = MyEnum.A;
if (Interlocked.CompareExchange(ref s_field.Int, (int)MyEnum.B, (int)MyEnum.A)
== (int)MyEnum.A)
{
Console.WriteLine("Changed from A to B");
}当然,这有点麻烦..。
发布于 2016-07-07 13:36:41
如何在评估后转换值?
int value = (int)MyEnum.A;
var result = Interlocked.CompareExchange(ref value, (int)MyEnum.A, (int)MyEnum.B);
if((MyEnum)result == MyEnum.A)
System.Console.WriteLine("Changed from A to B");https://stackoverflow.com/questions/38232638
复制相似问题