Pergunta

eu tenho classe A:

public class ClassA<T>

deriva da Classe B de A:

public class ClassB : ClassA<ClassB>

<> fortes Classe C deriva da classe B:

public class ClassC : ClassB

Agora eu tenho um método genérico com restrições

public static T Method<T>() where T : ClassA<T>

OK, agora eu quero chamar:

ClassC c = Method<ClassC>();

mas eu recebo o erro de compilação dizendo: Type argument 'ClassC' does not inherit from or implement the constraint type 'ClassA<ClassC>.

No entanto, o compilador irá permitir:

ClassB b = Method<ClassB>();

O meu entendimento é que esta falha porque herda ClassC ClassA<ClassB> vez de ClassA<ClassC>

A minha pergunta real é, é possível criar uma classe que deriva de ClassB que pode ser usado de alguma forma com o método genérico?

Isto pode parecer genéricos são usado em demasia e eu concordo. Eu estou tentando criar camada de objetos de negócios decorrentes dos objetos de dados subsônicos em um projeto separado.

Nota:. Eu coloquei o com espaços extras caso contrário, eles se despojado da questão

Foi útil?

Solução

Bem, você poderia alterar o método para:

public static T Method<T,U>() where T : ClassA<U> where U : T

Será que isso ajuda em tudo? Não é muito útil se você não pode mudar o método, é claro ...

Outras dicas

No. Você deve alterar ou envolva este método.

Aqui está a razão.

herda ClassC de ClassB que herda de ClasseA (ClassB)

ClassC não herda de ClassA (ClassC)

Nenhum filho de ClassB vai herdar de ClassA (classe infantil), porque em vez herdar de ClassB e não ClassB não herdar de ClassA (classe infantil).

tipos genéricos são invariantes .

Na maioria dos casos é possível resolver esse cenário por ter uma classe abstrata de base não-genérico:

public abstract class BasicClassA
{
}

public class ClassA<T> : BasicClassA
{
}

public class ClassB : ClassA<ClassB>
{
}

public class ClassC : ClassB
{
}

public static T Method<T>() where T : BasicClassA
{
    return null;
}

Sua milhagem pode variar, no entanto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top