Я пытаюсь написать обобщенную функцию c, которая ведет себя по-разному в зависимости от того, была ли она вызвана с аргументом, который допускает нулевые значения или нет. В мире до C # 8 я использовал что-то вроде этого:
T MyFunc<T>()
{
object value = SomeExternalFunctionCall();
if (value == null)
{
if (typeof(T).AcceptsNulls())
{
return null;
}
else
{
throw new Exception($"{typeof(T).Name} does not support nulls");
}
}
return (T)value;
}
Где AcceptsNulls()
было так:
public static bool IsAcceptNulls(this Type type)
{
if (type.IsValueType)
{
if (Nullable.GetUnderlyingType(type) != null)
{
return true;
}
return false;
}
return true;
}
Так что MyFunc
работал хорошо как для справки, так и для справки. типы значений, с надлежащей поддержкой для типов значений, допускающих значение NULL.
Но теперь я хочу иметь его в коде с поддержкой значений NULL. И я бы хотел, чтобы он мог различать guish MyFunc<object>()
и MyFunc<object?>()
случаев, поэтому он будет выдавать при обработке нулевого значения в первом случае, но не во втором.
Понятно, что я не могу проверить это с помощью проверки типа, поскольку обнуляемость ссылочного типа является функцией времени компиляции.
Как я могу это сделать? Это вообще возможно?
Обновление
Похоже, мое намерение неясно, поэтому я бы go уточнил детали.
У меня есть код, который производит значения. Иногда это может привести к нулю. И я хочу дать пользователю моего кода возможность решать, хочет ли он получить нулевые значения из моего кода или нет.
Со структурами, допускающими обнуление, он работает просто отлично:
int noNullsForThisVariable = MyFunc<int>();
int? nullsAreOkHere = MyFunc<int?>();
Я хочу обеспечить такое же поведение для ссылочных типов сейчас.