2012-07-02 22 views
6

Decir que tengo las siguientes tres clases/interfaces:¿Por qué no se puede convertir este tipo genérico?

public interface IImportViewModel 
{ 

} 

public class TestImportViewModel : IImportViewModel 
{ 

} 

public class ValidationResult<TViewModel> where TViewModel : IImportViewModel 
{ 

} 

Como TestImportViewModel implementa IImportViewModel, ¿por qué será lo siguiente que no se compile?

ValidationResult<IImportViewModel> r = new ValidationResult<TestImportViewModel>(); 

entiendo lo que el mensaje de error "No se puede convertir implícitamente el tipo 'ValidationResult' a 'ValidationResult'" significa. Simplemente no entiendo por qué este es el caso. ¿No sería esto covarianza?

+2

Estoy asumiendo que su clase _TestImportViewModel_ se supone que es _TViewModel_? (El código anterior no muestra la clase TViewmModel en absoluto). –

+0

Sí. TestImportViewModel implementa IImportViewModel y, por lo tanto, __debe ser capaz de ser utilizado como una implementación de TViewModel como TViewModel: IImportViewModel. – devlife

+3

@Sam TViewmModel (también conocido como ) es un tipo de IImportViewModel no es una clase. – Reniuz

Respuesta

8

¿Esto no sería covarianza?

Sí, salvo que en C# 4.0 la covarianza solo funciona en las interfaces. Por lo que tendrá que hacer su ValidationResult implementar una interfaz covariante (uno para el cual el parámetro genérico se define como out):

public interface IImportViewModel 
{ 
} 

public class TestImportViewModel : IImportViewModel 
{ 
} 

public interface IValidationResult<out TViewModel> where TViewModel : IImportViewModel 
{ 
} 

public class ValidationResult<TViewModel> : IValidationResult<TViewModel> where TViewModel : IImportViewModel 
{ 
} 

y ahora se puede hacer esto:

IValidationResult<IImportViewModel> r = new ValidationResult<TestImportViewModel>(); 
+1

Aún no puede asignar 'ValidationResult ', solo puede asignar 'IValidationResult '. Esto es desafortunado. – ja72

+0

Gran explicación @Darin. Gracias. – devlife

Cuestiones relacionadas