6

次の3つのクラス/インターフェイスがあるとします。

public interface IImportViewModel
{

}

public class TestImportViewModel : IImportViewModel
{

}

public class ValidationResult<TViewModel> where TViewModel : IImportViewModel
{

}

TestImportViewModelはIImportViewModelを実装しているのに、なぜ以下がコンパイルされないのですか?

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

「タイプ'ValidationResult'を'ValidationResult'に暗黙的に変換できません」というエラーメッセージの意味を理解しています。なぜそうなのか理解できません。これは共分散ではないでしょうか?

4

1 に答える 1

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>();
于 2012-07-02T13:32:16.407 に答える