Ответ 1
Это, скорее всего, предназначено для обеспечения дополнительной безопасности типов для методов, которые возвращают (или принимают) экземпляр более производного типа, сохраняя вызывающих от необходимости приведения результата к более производному типу.
abstract class Cloneable<T> where T : Cloneable<T>
{
public abstract T Clone();
}
sealed class MyCloneable : Cloneable<MyCloneable>
{
public override MyCloneable Clone()
{
return new MyCloneable();
}
}
MyCloneable instance = new MyCloneable();
MyCloneable clone = instance.Clone();
ИЗМЕНИТЬ
Согласно комментарию @siride, это известно как любопытно повторяющийся шаблон шаблона. Эрик Липперт написал замечательную статью о ее применении в С#:
https://blogs.msdn.microsoft.com/ericlippert/2011/02/03/curiouser-and-curiouser/
P.S. И просто для того, чтобы проиллюстрировать, как выглядел бы приведенный выше пример, если бы вы убрали общее ограничение:
abstract class Cloneable
{
public abstract Cloneable Clone();
}
sealed class MyCloneable : Cloneable
{
public override Cloneable Clone()
{
return new MyCloneable();
}
}
MyCloneable instance = new MyCloneable();
MyCloneable clone = (MyCloneable)instance.Clone(); // Note the cast.