【发布时间】:2021-09-07 08:50:37
【问题描述】:
考虑在具有nullable reference types 功能的 .NET 5 类库中的这个 C# 类启用:
public class ContraMapComparer<T, T1> : IEqualityComparer<T1>
{
private readonly IEqualityComparer<T> source;
private readonly Func<T1, T> selector;
public ContraMapComparer(IEqualityComparer<T> source, Func<T1, T> selector)
{
this.source = source;
this.selector = selector;
}
public bool Equals(T1? x, T1? y)
{
if (x is null && y is null)
return true;
if (x is null || y is null)
return false;
return source.Equals(selector(x), selector(y));
}
public int GetHashCode([DisallowNull] T1 obj)
{
return source.GetHashCode(selector(obj));
}
}
[DisallowNull] 属性由 Visual Studio 的启用接口快速操作添加。
编译时,编译器会发出以下警告:
CS8607 A possible null value may not be used for a type marked with [NotNull] or [DisallowNull]
显然,如果您启用了将警告视为错误(我有),这意味着代码无法编译。
如何解决这个问题?
我尝试将运行时空保护添加到 obj、source 和 selector,但这没有帮助。我还尝试将[DisallowNull] 属性添加到source 和selector,但这也无济于事。
为[DisallowNull] 阅读the documentation 并没有让我更加明智。
即使删除[DisallowNull] 属性也无法解决问题。编译器警告仍然存在。
我能够识别的唯一解决方法是使用#pragma 来抑制警告:
#pragma warning disable CS8607 // A possible null value may not be used for a type marked with [NotNull] or [DisallowNull]
return source.GetHashCode(selector(obj));
#pragma warning restore CS8607 // A possible null value may not be used for a type marked with [NotNull] or [DisallowNull]
还有其他解决办法吗?
【问题讨论】:
-
您是否尝试过使用
!?return source.GetHashCode(selector(obj)!);例如。 (我不清楚表达式的哪一部分导致了警告 - 它可能是selector(obj)部分;您可以将其拆分为单独的表达式进行检查。) -
如果
obj是null,你可以——而且可能应该——也抛出。 -
@vernou - 在问题中 - “即使删除 [DisallowNull] 属性也无法解决问题”
-
你有没有试过给
selector(obj)的result添加一个空保护? -
根据您实际尝试对您的类型执行的操作,添加
where T : notnull约束也可以解决问题。
标签: c# nullable-reference-types