我的代码大致如下:
#nullable enable
class MyClass<KEY, ITEM>
{
readonly Dictionary<KEY, ITEM> Map = new Dictionary<KEY, ITEM>();
public void Process(KEY key, ITEM item)
{
if (key != null)
{
Map[key] = item;
}
}
}
#nullable disable
编译器对此不是很满意,它给了我一个警告。
type 'KEY' cannot be used as type parameter 'TKey' in the generic type or method 'Dictionary<TKey, TValue>
我完全理解这一点。问题在于,对于 Process() 方法的 'key' 参数,发送 null 是完全有效的,所以我不能向该类添加“where KEY:notnull”约束。(并且 MyClass 需要接受类和结构体作为 KEY 类型参数)
我能想到的唯一方法是:
#nullable enable
class MyClass<KEY, ITEM>
{
#nullable disable
readonly Dictionary<KEY, ITEM> Map = new Dictionary<KEY, ITEM>();
#nullable enable
public void Process(KEY key, ITEM item)
{
if (key != null)
{
Map[key] = item;
}
}
}
#nullable disable
这样做可以让编译器更加满意,但是我就无法使用 C# 8 中提供的所有漂亮的空值检查了。例如,这使我能够编写以下代码:
Map[default] = item;
编译器毫不犹豫。
我如何告诉编译器,Dictionary<>中的“KEY”类型参数应该禁止为null,但仍允许外部类中的KEY值为null?
编辑
我想使用新的C# 8空值功能,以便能尽可能多地在编译时捕获空指针(而不是等待运行时异常)。
进一步编辑
目前,我正在朝着在Dictionary周围放置一个薄层来强制执行空限制并使用其代替Dictionary<>的方向发展。
#nullable enable
public class CheckDictionary<KEYTYPE, VALUETYPE>
{
#nullable disable
readonly Dictionary<KEYTYPE, VALUETYPE> Dictionary = new Dictionary<KEYTYPE, VALUETYPE>();
#nullable enable
public VALUETYPE this[[DisallowNull] KEYTYPE key]
{
get { return Dictionary[key]; }
set { Dictionary[key] = value; }
}
public bool Remove([DisallowNull] KEYTYPE key)
{ return Dictionary.Remove(key); }
public bool TryGetValue([DisallowNull] KEYTYPE key, out VALUETYPE value)
{ return Dictionary.TryGetValue(key, out value); }
public List<VALUETYPE> Values => Dictionary.Values.ToList();
}
Key
(大写 "K",小写 "ey")在你的源代码中并没有出现。 - Flydog57