Esta é uma questão de sintaxe. Eu tenho uma classe genérica que está herdando de uma classe base genérica e está aplicando uma restrição a um dos parâmetros de tipo. Também quero que a classe derivada implemente uma interface. Pela minha vida, não consigo descobrir a sintaxe correta.
Isso é o que eu tenho:
DerivedFoo<T1,T2> : ParentFoo<T1, T2> where T2 : IBar { ... }
A primeira coisa que me veio à mente foi:
DerivedFoo<T1,T2> : ParentFoo<T1, T2> where T2 : IBar, IFoo { ... }
Mas isso é incorreto, pois faz com que T2 precise implementar IBar e IFoo, não DerivedFoo para implementar IFoo.
Tentei pesquisar um pouco no Google, usar dois-pontos, ponto e vírgula, etc., mas não consegui. Tenho certeza de que a resposta é extremamente simples.
c#
generics
inheritance
interface
constraints
Dan Rigby
fonte
fonte
Respostas:
Você inclui a assinatura inteira de sua classe antes de definir restrições genéricas.
fonte
where T2 : IBar, IFoo
apenas significa queT2
deve implementar ambas as interfaces em vez deDerivedFoo<T1,T2>
implementarIFoo
Minha recomendação: quando você tiver uma dúvida sobre a sintaxe da linguagem C #, leia a especificação; é por isso que o publicamos. Você vai querer ler a seção 10.1.
Para responder à sua pergunta específica, a ordem das coisas em uma declaração de classe é:
Tudo nessa lista é opcional, exceto "classe", o nome e o corpo, mas tudo deve aparecer nessa ordem se aparecer.
fonte
fonte
Esta é uma extensão das respostas existentes. O padrão é
string
se você não fornecer um tipo. Não implementei uma interface, mas isso não deve exigir nada diferente do normal.fonte