РЕДАКТИРОВАТЬ: см. Мое обновление ниже о моей позиции на Null в C # 8.0, прежде чем дать мне варианты шаблонов и таких
Исходный вопрос
Я пытаюсь обновить базовые библиотеки до «пустого», т. Е. С помощью флага C # 8.0 <Nullable>enable</Nullable>
.
При попытке работать с абстракциями ив конкретных дженериках я столкнулся с некоторыми проблемами. Рассмотрим следующий фрагмент кода, который принимает Action
и преобразует его в Func<TResult>
. Это pre-nullable-enable :
public static Func<TResult> ToFunc<TResult>(this Action action)
=> () => { action(); return default; }
;
, но post-nullable-enable Кажется, мне трудно, потому что я не могу сделать TResult nullable (или * 1024)*) поскольку остроумие потребует ограничения либо where TResult: class
, либо where TResult: struct
. Я не могу объединить эти два ограничения, чтобы компилятор знал, что TResult может быть классом или типом значения. Что на данный момент меня раздражает - так как нужно уметь выражать , не имеет значения, будет ли класс или структура, оно будет обнуляться (независимо от предшествующего дизайна .NET).
Итак, post-nullable-enable Кажется, у меня есть только одна опция - дублирование кода, примеры ниже:
public static Func<TResult?> ToFuncClass<TResult>(this Action action)
where TResult : class
=> () => { action(); return null; }
;
public static Func<TResult?> ToFuncStruct<TResult>(this Action action)
where TResult : struct
=> () => { action(); return null; }
;
Оба дублирования кода а также схемы именования , которые идут с этим, меня очень беспокоит. Возможно, я неправильно понимаю правильное использование или, возможно, мне не хватает другой функции спецификации, но как бы вы решили эту проблему?
ОБНОВЛЕНИЕ : На самом деле, я думаю, что 'Я предпочел бы придерживаться моих собственных реализаций с нулевой обработкой , чем использовать обнуляемую функцию C # 8.0Как "Void" объект или выделенный "Option / Maybe / None" -solution , кажется, лучше передает информацию. Единственное, что меня беспокоит, это то, что это не очень полезно в продвижении языка вперед , в обучении новым кодировщикам и представлении другого третьего лица/ не нативное растворение в универсальное провлем, что у всех нас есть работа с нулем . Поскольку собственные реализации обработки с нулем хороши и все, но подходят по-разному в каждой кодовой базе, должны поддерживаться сообществом, и у вас есть различные варианты. Так что было бы очень полезно и чрезвычайно полезно, если бы язык полностью его соблюдал и если стандарт повысился. На что я надеялся, это будет - ясно, что это не так, и я понимаю. Но я чувствую, что это упущенная возможность.
Thx Yves