Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

143
Visualizações
La contravarianza no es válida cuando se usa el delegado de la interfaz como tipo de parámetro

Considere la definición de interfaz contravariante con un delegado:

 public interface IInterface<in TInput> { delegate int Foo(int x); void Bar(TInput input); void Baz(TInput input, Foo foo); }

La definición de Baz falla con un error:

CS1961
Varianza no válida: el parámetro de tipo ' TInput ' debe ser covariantemente válido en ' IInterface<TInput>.Baz(TInput, IInterface<TInput>.Foo) '. ' TInput ' es contravariante.

Mi pregunta es ¿por qué ? A primera vista, esto debería ser válido, ya que el delegado de Foo no tiene nada que ver con TInput . No sé si es que el compilador es demasiado conservador o si me estoy perdiendo algo.

Tenga en cuenta que normalmente no declararía un delegado dentro de una interfaz, en particular, esto no se compila en versiones anteriores a C# 8, ya que un delegado en una interfaz necesita implementaciones de interfaz predeterminadas.

¿Hay alguna manera de romper el sistema de tipos si se permitiera esta definición, o el compilador es conservador?

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

No estoy seguro de si se trata de un problema de covarianza frente a contravarianza.

  1. El delegado de Foo no es miembro de la interfaz. Es una declaración de tipo anidado.
  2. IInterface<A>.Foo e IInterface<B>.Foo son dos tipos diferentes.
  3. Esto hace que el parámetro foo de dos IInterface<T>.Baz (con T = A y B ) sea incompatible.
  4. Por lo tanto, no puede sustituir una IInterface<A> por una IInterface<B> o viceversa (sin importar cuál sea la relación de herencia entre A y B ).
  5. Conclusión: IInterface<T> no puede ser variante (ni co- ni contra-).

Resolución:

  • Mueva el delegado al nivel superior (en el cuerpo de un espacio de nombres). Es una declaración de tipo, por lo que no es necesario incrustarla.
  • O incrustarlo en un tipo sin parámetro de tipo. Por ejemplo, podría crear una IInterface no genérica para esto (y conservar la genérica).

Pero @EricLippert ciertamente lo sabe mejor.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda