上記のように動作するには、不変 (セッターなし) にする必要があります。おそらく、便宜上、いくつかの暗黙の変換演算子を使用します。そうしないと、(揮発性の) 参照を変更せずに値を変更する可能性があります。
public class MyThreadedClass
{
volatile Box<double> volDouble = 123.45;
}
public class Box<T> where T : struct
{
private readonly T value;
public Box(T value) { this.value = value; }
public T Value {get {return value;}}
// explicit as nulls are a problem...
public static explicit operator T(Box<T> box) {
return box.value; }
public static implicit operator T?(Box<T> box) {
return box == null ? new T?() : new T?(box.value); }
public static implicit operator Box<T>(T value) {
return new Box<T>(value); }
public static implicit operator Box<T>(T? value) {
return value.HasValue ? new Box<T>(value.Value) : null; }
}
それを超えて-ロックが最良のオプションです。