Основное преимущество: теперь реализующий тип может ссылаться на себя, а не на базовый тип, уменьшая необходимость приведения типов
Хотя может показаться, что ограничение типа, относящееся к самому , заставляет тип реализации делать то же самое, но на самом деле это не то, что он делает. Люди используют этот шаблон, чтобы попытаться выразить шаблоны в форме «переопределение этого метода должно возвращать тип переопределяющего класса», но на самом деле это не ограничение, выраженное или применяемое системой типов. Я приведу пример здесь:
http://blogs.msdn.com/b/ericlippert/archive/2011/02/03/curiouser-and-curiouser.aspx
Хотя это очень хорошо, я также заметил, что эти ограничения параметров типа не являются интуитивными и имеют тенденцию становиться действительно трудными для понимания в более сложных сценариях
Да. Я стараюсь избегать этой картины. Трудно рассуждать.
Кто-нибудь знает другой шаблон кода C #, который достигает того же эффекта или чего-то подобного, но более легким для понимания способом?
Нет в C #, нет. Вы могли бы рассмотреть возможность взглянуть на систему типов Haskell, если вас интересует такая вещь; «Высшие типы» в Haskell могут представлять такие типы шаблонов типов.
Объявление X<T> where T : X<T>
кажется рекурсивным, и можно задаться вопросом, почему компилятор не застревает в бесконечном цикле, рассуждая: «Если T
является X<T>
, то X<T>
действительно является X<X<…<T>…>>
".
Компилятор никогда не попадает в бесконечные циклы, рассуждая о таких простых отношениях. Однако номинальный подтип родовых типов с контравариантностью в общем случае неразрешимый . Существуют способы заставить компилятор бесконечно регрессировать, и компилятор C # не обнаруживает их и не предотвращает их, прежде чем отправиться в бесконечное путешествие. (Пока. Я надеюсь добавить обнаружение для этого в компиляторе Roslyn, но посмотрим.)
См. Мою статью на эту тему, если вас это интересует. Вы также захотите прочитать связанную статью.
http://blogs.msdn.com/b/ericlippert/archive/2008/05/07/covariance-and-contravariance-part-twelve-to-infinity-but-not-beyond.aspx