É possível em C # para sobrecarregar um operador de conversão genérico da seguinte maneira?

StackOverflow https://stackoverflow.com/questions/1025576

Pergunta

Basta saber se há qualquer maneira para representar o seguinte código em C # 3.5:

public struct Foo<T> {

    public Foo(T item) {
        this.Item = item;
    }

    public T Item { get; set; }

    public static explicit operator Foo<U> ( Foo<T> a )
        where U : T {

        return new Foo<U>((U)a.Item)
    }
}

Graças

Foi útil?

Solução

Operadores de conversão não pode ser genérica. Na seção especificação 10.10, aqui está o formato de uma conversão-operador-declarator:

conversion-operator-declarator:
    implicit   operator   type   (   type   identifier   )
    explicit   operator   type   (   type   identifier   )

Compare isso com, digamos, um método-header:

método de cabeçalho : atributos opt método modificadores opt parcial opt retorno do tipo member-name tipo de parâmetro-list opt (-formal parâmetro-list opt ) -tipo parâmetro de restrições de cláusulas opt

(Desculpe sobre a formatação -. Não sei como fazê-lo melhor)

Note que o formato operador não inclui uma lista tipo de parâmetro ou restrições de parâmetro de tipo.

Outras dicas

O código resume-se a linha: return new Foo<U>((U)a.Item)

Onde você tentar atribuir um baseclass a uma classe herdada, o que é impossível.

Vamos digamos T (base-class) é do tipo Stream e U é do tipo MemoryStream (classe herdada), você não pode atribuir um Stream a uma variável do tipo MemoryStream.

Eu acho que a resposta é "Não é possível. Tente usar um método em vez"

Também parece ser joguete desta questão Solução para operador sobrecarregado restrição em .NET genéricos

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