通用继承和类型转换

时间:2013-04-14 19:35:39

标签: c# generics

所以我试图将一些WPF视图/视图模型抽象为解耦的可重用对象。现在我陷入困境,以至于我甚至不确定下一步该尝试什么。我希望那里的人可以帮助解锁我的大脑。

这是一个简化的示例和错误

    public interface IBasicListDto{}

    public interface IBasicListVm<T> where T : IBasicListDto
    {
        void DoSomthing();
    }  

    public class BasicListVm<T> : IBasicListVm<T> where T : IBasicListDto
    {
        public void DoSomthing()
        {
            Console.WriteLine("woohoo!!");
        }
    }

   public class MyBasicListDto : IBasicListDto{}

   public class MyBasicListVm<T> : BasicListVm<T> where T : MyBasicListDto {}

   private void Button_Click(object sender, RoutedEventArgs e)
   {
        IBasicListVm<IBasicListDto> vm = (IBasicListVm<IBasicListDto>)new MyBasicListVm<MyBasicListDto>();
        vm.DoSomthing();
    }   

我在Button_Click方法的第一行遇到以下运行时错误。

System.InvalidCastException未处理   的HResult = -2147467262   Message =无法转换类型为'MyBasicListVm 1[testGenericInheritance.MainWindow+MyBasicListDto]' to type 'IBasicListVm 1 [testGenericInheritance.MainWindow + IBasicListDto]'的对象。   来源= testGenericInheritance   堆栈跟踪:

我已经看到了一些类似的问题/答案,但我的大脑并不是“得到它”足以做出必要的改变。

1 个答案:

答案 0 :(得分:0)

您可以IBasicListVm<T>协变:

public interface IBasicListVm<out T> where T : IBasicListDto
{
    void DoSomthing();
}