То, что вы выбираете, сильно зависит от того, что требуется. Я предпочитаю явное приведение
IMyInterface = (IMyInterface)someobj;
, потому что если объект должен иметь тип IMyInterface, а это не так - это определенно проблема. Лучше получить ошибку как можно раньше, потому что точная ошибка будет исправлена, а не побочный эффект.
Но если вы имеете дело с методами, которые принимают object
в качестве параметра, то вам необходимо проверить его точный тип перед выполнением любого кода. В таком случае было бы полезно as
, чтобы вы могли избежать InvalidCastException
.
Отвечать на вопрос в Заголовок , но не тело вопроса.
Для покрытия весь типы обычно подразумевали Value Types
(который включает Типы Значения Nullable , и также string
даже при том, что это технически Ссылочный тип ), Вам нужны 3 перегрузки:
public void Foo<T>(T arg) where T : struct
public void Foo<T?>(T? arg) where T : struct
public void Foo<string>(string arg)
От Документы MSDN об универсальных ограничениях :
where T : struct
аргумент типа должен быть не допускающим NULL-значения типом значения.