首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将ref [enum类型]转换为ref?

如何将ref [enum类型]转换为ref?
EN

Stack Overflow用户
提问于 2016-07-06 19:53:15
回答 4查看 1.5K关注 0票数 0

我希望将Interlocked.CompareExchange与继承自int的枚举类型一起使用,如下所示:

代码语言:javascript
复制
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传递:

代码语言:javascript
复制
// 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来代替?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-06-19 03:50:51

我相信现在Unsafe类是可能的,它是在.NET核心中引入的。运行以下命令将包含类的包安装到应用程序中:

代码语言:javascript
复制
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或更高版本。

票数 0
EN

Stack Overflow用户

发布于 2016-07-07 13:13:38

你想用工会吗?

代码语言:javascript
复制
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;
代码语言:javascript
复制
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");
}

当然,这有点麻烦..。

票数 0
EN

Stack Overflow用户

发布于 2016-07-07 13:36:41

如何在评估后转换值?

代码语言:javascript
复制
        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");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38232638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档