由于类实现了所需的接口,因此应该没有时转换错误

时间:2018-05-03 20:29:13

标签: c# inheritance interface covariance contravariance

我有一个如下界面:

public interface IPageViewModel<T> where T : class
{
    string ViewName { get; set; }
    T SelectedItem { get; set; }
    List<T> ItemsList { get; set; }
}

然后,我有两个班级:

internal class TestViewModel : IPageViewModel<INotifyPropertyChanged> //let's skip the fact that T is supposed to be a class while it somehow compiles and works with an interface...

internal class HardwareViewModel : IPageViewModel<Hardware>

Hardware的位置:

public class Hardware : NotificationObject

NotificationObject是:

public class NotificationObject : INotifyPropertyChanged

最后,我有一个课程如下:

internal class NavigationViewModel
{
    public List<IPageViewModel<INotifyPropertyChanged>> PageViewModelsList { get; set; } = new List<IPageViewModel<INotifyPropertyChanged>>();

    public NavigationViewModel()
    {
        PageViewModelsList.Add(new TestViewModel());
        PageViewModelsList.Add(new HardwareViewModel()); //error
    }
}

现在,问题是:当构造函数中的第一行编译正常时,第二行会抛出错误:cannot convert from ViewModels.HardwareViewModel to Helpers.IPageViewModel<System.Component.INotifyPropertyChanged>
但这毫无意义。 Hardware继承自NotificationObjectINotifyPropertyChanged IPageViewModel<Hardware> === IPageViewModel<INotifyPropertyChanged>。任何人都可以解释为什么会有错误吗?

1 个答案:

答案 0 :(得分:0)

感谢评论我已经意识到导致这些问题的主题被称为“差异”。所以在看了一下之后我决定采用这个解决方案:

public interface IPageViewModel
{
    string ViewName { get; set; }
}

但如果有人想保留这些字段并保持其界面协变,那么它必须看起来像这样:

public interface IPageViewModel<out T> where T : class
{
    string ViewName { get; set; }
    T SelectedItem { get; }
    IEnumerable<T> ItemsList { get; }
}