У меня есть метод, заключающий в себе какой-то внешний вызов API, который часто возвращает null
. Когда это произойдет, я хочу вернуть значение default
. Метод выглядит так
public static T GetValue<T>(int input)
{
object value = ExternalGetValue(input);
return value != null ? (T)value : default(T)
}
Проблема в том, что (T)value
может выдать недопустимое исключение приведения. Поэтому я подумал, что смогу изменить его на
var value = ExternalGetValue(input) as Nullable<T>;
но для этого требуется where T : struct
, и я также хочу разрешить ссылочные типы.
Затем я попытался добавить перегрузку, которая бы справилась с обоими.
public static T GetValue<T>(int input) where T : struct { ... }
public static T GetValue<T>(int input) where T : class { ... }
но я обнаружил, что вы не можете перегружать в зависимости от ограничений.
Я понимаю, что у меня может быть два метода с разными именами, один для необнуляемых типов и один для ненулевых типов, но я бы предпочел этого не делать.
Есть ли хороший способ проверить, могу ли я привести к T
без использования as
? Или я могу использовать as
и иметь один метод, который работает для всех типов?