2012-07-02 56 views
6

說我有以下三個類/接口:爲什麼這個泛型類型不能轉換?

public interface IImportViewModel 
{ 

} 

public class TestImportViewModel : IImportViewModel 
{ 

} 

public class ValidationResult<TViewModel> where TViewModel : IImportViewModel 
{ 

} 

由於TestImportViewModel實現IImportViewModel,爲什麼會下無法編譯?

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

我明白了什麼錯誤消息「無法隱式轉換類型‘的ValidationResult’到‘的ValidationResult’」的意思。我只是不明白爲什麼會出現這種情況。這不是協變性嗎?

+2

我假設你類_TestImportViewModel_應該是_TViewModel_? (上面的代碼根本不顯示類TViewmModel)。 –

+0

是的。 TestImportViewModel實現IImportViewModel從而__should__能夠被用作TViewModel實現作爲TViewModel:IImportViewModel。 – devlife

+3

@Sam TViewmModel(又名)是IImportViewModel類型,它不是一個類。 – Reniuz

回答

8

這會不會是協方差?

是的,除了在C#4.0協方差只適用於接口。所以,你必須讓你ValidationResult實現協接口(一個用於其通用參數定義爲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 
{ 
} 

,現在你可以這樣做:

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

您仍然無法分配到'的ValidationResult '你只能分配給'IValidationResult '。這很不幸。 – ja72

+0

很好的解釋@Darin。謝謝。 – devlife

相關問題