Как я могу проверить, может ли значение быть приведено к универсальному типу? - PullRequest
4 голосов
/ 16 марта 2012

У меня есть метод, заключающий в себе какой-то внешний вызов 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 и иметь один метод, который работает для всех типов?

1 Ответ

7 голосов
/ 16 марта 2012

Вы можете использовать is:

return value is T ? (T)value : default(T);

(Обратите внимание, что value is T вернет false, если value равно нулю.)

...