Мой код выглядит примерно так:
#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>
, которое я могу понять. Проблема в том, что отправка null для параметра 'key' в Process () совершенно допустима, поэтому я не могу добавить к классу ограничение 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;
, и компилятор не моргнет глазом.
Как я могу сообщить компилятору, что параметр типа KEY должен Dictionary <> должен запрещать нулевые значения, но все же разрешать значениям KEY быть нулевыми во внешнем классе? как можно больше нулевых указателей во время компиляции (вместо ожидания исключений во время выполнения). нулевые ограничения и использовать его вместо 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();
}