В другом вопросе StackExchange я заметил, что кто-то использует этот прототип:
void DoSomething<T>(T arg) where T: SomeSpecificReferenceType
{
//Code....
}
Принимая во внимание, что есть только один тип ограничений ( SomeSpecificReferenceType
), в чем разница и преимущество такого написания, а не просто:
void DoSomething(SomeSpecificReferenceType arg)
{
//Code....
}
В обоих случаях arg
будет проводиться проверка типов во время компиляции. В обоих случаях тело метода может безопасно полагаться на знания, arg
относящиеся (или являющиеся потомками) к конкретному типу, известному во время компиляции.
Является ли это случаем чрезмерно усердного разработчика, который изучает дженерики, прежде чем узнает об обычном наследовании? Или есть законная причина, почему подпись метода будет написана таким образом?
Ответы:
Да, это возможно.
Может быть . Как правило, было бы более разумно, если бы использовалось возвращаемое значение
T
или другой используемый параметрT
.Но возможно, что внутреннее содержимое кода использует
T
(возможно, в качестве аргумента для сериализатора?) И должно использовать конкретно,T
а не класс ограничений. Иногда вы увидите, что когда ограничение является интерфейсом, сопряженным сnew
ограничением, и внутренности методаT
по какой-то причине создают s.Поэтому, хотя редко можно увидеть необходимую версию ограничения, бывают случаи, когда она есть. И всегда возможно, что метод раньше нуждался в этом, но теперь нет, и разработчик оставил его как есть, чтобы не вносить критических изменений.
источник
Я думаю, что я помню себя, набирая ответ, содержащий это.
В то время причина была такой:
(Код может быть другим. Просто для иллюстрации одной из возможных причин, по которой существует ограничение на параметр типа в универсальном методе.)
По сути, код сам выполняет ручное кодирование манипуляций с типами. Это может также быть смешано с некоторыми вещами отражения.
Например, используя
Method<T>(T arg) where T : ...
, можно заменитьarg.GetType()
наtypeof(T)
. Хотя я не знаю, хорош этот выбор или плох.Я полагаю, что это всего лишь пример того, как автор (возможно, я или кто-то еще) недостаточно тщательно продумал все возможности кодирования и в то же время слишком сосредоточился на другом вопросе / проблеме.
источник