É possível em C # para sobrecarregar um operador de conversão genérico da seguinte maneira?
-
06-07-2019 - |
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
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