以下代码在中正常工作。NET核心3.1,但错误地生成警告CS8625无法将null文本转换为不可为null的引用类型:
#nullable enable
using System.Threading;
namespace InterlockedExchangeNullProblem {
public class Class1 {
public Class1() {
object? o = new object();
var o1 = Interlocked.Exchange(ref o, null); // ok
class2? c = new class2();
var c1 = Interlocked.Exchange(ref c, null); // error CS8625 Cannot convert null literal to non-nullable reference type.
}
}
public class class2{}
}
如果它适用于object?
,那么它也应该适用于class2?
。
解决方案:
var c2 = Interlocked.Exchange<class2?>(ref c, null);
注意:编译器使c1的类型为class2
,而不是class2?
。
如果你同意这需要纠正,那么请投赞成票:
developercommunity.visualstudio.com:已互锁。Exchange:编译器选择了具有可为null类型的错误Exchange