2012-07-02 19 views
6

Say mam następujące trzy klasy/interfejsy:Dlaczego ten typ ogólny nie może zostać przekonwertowany?

public interface IImportViewModel 
{ 

} 

public class TestImportViewModel : IImportViewModel 
{ 

} 

public class ValidationResult<TViewModel> where TViewModel : IImportViewModel 
{ 

} 

Jak TestImportViewModel realizuje IImportViewModel, dlaczego następujących nie skompilować?

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

rozumiem co się komunikat o błędzie „Nie można niejawnie przekonwertować typu«ValidationResult»do«ValidationResult»” środków. Po prostu nie rozumiem, dlaczego tak się dzieje. Czy to nie byłaby kowariancja?

+2

Ja zakładając, że klasa _TestImportViewModel_ ma być _TViewModel_? (Powyższy kod w ogóle nie pokazuje klasy TViewmModel). –

+0

Tak. TestImportViewModel implementuje IImportViewModel, a tym samym __ może być użyty jako implementacja TViewModel jako TViewModel: IImportViewModel. – devlife

+3

@Sam TViewmModel (alias ) jest typem IImportViewModel nie jest klasą. – Reniuz

Odpowiedz

8

Czy to nie byłaby kowariancja?

Tak, z wyjątkiem tego, że w C# 4.0 kowariancja działa tylko na interfejsach. Więc trzeba będzie zrobić swój ValidationResult wdrożyć kowariantna interfejsu (jeden dla których parametr generyczny jest zdefiniowany jako 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 
{ 
} 

a teraz można to zrobić:

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

Nadal nie można przypisać do 'ValidationResult ' można tylko przypisać do 'IValidationResult . To niefortunne. – ja72

+0

Świetne wyjaśnienie @ Darin. Dzięki. – devlife

Powiązane problemy