如何装箱和拆箱具有类型安全的结构

How to box and unbox a struct with type safety

.NET 平台中有 a struct,我想将其用作我的 class 的状态。重要的是该结构是内置的,所以我无法更改它。假设这个内置结构是下面的 ImmutableStruct

struct ImmutableStruct
{
    public string Value { get; }

    public ImmutableStruct(string value) { Value = value; }
}

我的class要求是线程安全的,所以必须声明状态volatile。当然还有其他方法可以实现线程安全,但可以说 volatile 字段已被选为特定情况下的最佳选择。所以我这样编码 class:

class MyClass
{
    private volatile ImmutableStruct _state = new ImmutableStruct("SomeString");
    // Error CS0677
    // 'MyClass._state': a volatile field cannot be of the type 'ImmutableStruct'

    public ImmutableStruct State => _state;

    /* Method that mutates the _state is omitted */
}

不幸的是,编译器不允许 volatile 结构字段。所以我决定使用 boxing and unboxing:

class MyClass
{
    private volatile object _state = new ImmutableStruct("SomeString");

    public ImmutableStruct State => (ImmutableStruct)_state;

    /* Method that mutates the _state reference is omitted */
}

这行得通,但是从对象进行转换让我感到焦虑,因为程序可能会出现 运行 时错误。我想要一个类型安全的解决方案,编译器在编译时确保程序的正确性。所以我的问题是:有什么方法可以对具有类型安全性的结构进行装箱和拆箱吗?

顺便说一句,有一个关于将结构标记为 volatile 的相关问题:。我的问题推迟了,因为它特别关注 boxing/unboxing 操作的类型安全。

像这样创建通用包装器如何:

public  class ReadonlyStructWrapper<T> where T: struct 
    {
        public T Value { get; }
        public ReadonlyStructWrapper(T value)
        {
            Value = value;
        }
    }