我有一个伪实时数据处理应用程序,我想使用LazyInit<double>
所以我不做我不需要的计算,但是LazyInit<T>
将T限制为类。我可以解决它,但我显然不愿意。
有人知道这是为什么吗?
答案 0 :(得分:4)
我们当前(预览)位仅提供LazyInit类型,并且正如您所观察到的(和JaredPar正确诊断)我们将T限制为引用类型,以便我们可以:(i)使LazyInit成为结构,并且(ii)提供合理的通过CMPXCHG的默认行为(即,我们可以检查'null'表示没有值)。我们本可以使T不受限制,但决定针对常见情况进行优化 - 否则就意味着需要额外的几个字节;不管你信不信,这种情况可能会让某些人过于昂贵。
我们最近稍微改变了路线。我们目前计划提供一种LazyInit类型,其中T不受限制以及到LazyInitField类型,其中T仅限于引用类型。前者是大多数人会使用的,但后者可以用于那些具有敏感性且可以忍受T限制的人。
希望这可以解决问题。欢呼声,
--- joe duffy,pfx dev lead
答案 1 :(得分:2)
原因是LazyInit中的底层API选择。它使用Interlocked.CompareExchange来执行线程安全值集。 CompareExchange虽然泛型被限制为仅使用类类型。因此,LazyInit的T值也必须是一个类。
您可以在此处查看实施:LazyInit
答案 2 :(得分:0)
我认为这是因为值类型是自动初始化的,并且LazyInit根据它是否为null来确定某些内容是否需要初始化。你可以通过使用可空类型来绕过它。
LazyInit<double?>