Ответ 1
Перед определением общих ограничений вы включаете всю подпись своего класса.
class DerivedFoo<T1, T2> : ParentFoo<T1, T2>, IFoo where T2 : IBar
{
...
}
Это синтаксический вопрос. У меня есть общий класс, который наследуется от общего базового класса и применяет ограничение к одному из параметров типа. Я также хочу, чтобы производный класс реализовал интерфейс. Для моей жизни я не могу понять правильный синтаксис.
Это то, что у меня есть:
DerivedFoo<T1,T2> : ParentFoo<T1, T2> where T2 : IBar { ... }
Первое, что пришло в голову, было следующее:
DerivedFoo<T1,T2> : ParentFoo<T1, T2> where T2 : IBar, IFoo { ... }
Но это неверно, поскольку это приводит к тому, что T2 необходимо реализовать как IBar, так и IFoo, а не DerivedFoo для реализации IFoo.
Я пробовал немного Googling, использование двоеточий, точки с запятой и т.д., но я оказался коротким. Я уверен, что ответ головокружительно прост.
Перед определением общих ограничений вы включаете всю подпись своего класса.
class DerivedFoo<T1, T2> : ParentFoo<T1, T2>, IFoo where T2 : IBar
{
...
}
Моя рекомендация: когда у вас возник вопрос о синтаксисе языка С#, прочитайте спецификацию; почему мы его публикуем. Вы хотите прочитать раздел 10.1.
Чтобы ответить на ваш конкретный вопрос, порядок вещей в объявлении класса:
Все в этом списке является необязательным, кроме "класса", имени и тела, но все должно появляться в этом порядке, если оно появляется.
public interface IFoo {}
public interface IBar {}
public class ParentFoo<T,T1> { }
public class DerivedFoo<T, T1> : ParentFoo<T, T1>, IFoo where T1 : IBar { }