Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这些类是否可以实现这些接口?_C#_Generics_Interface_Covariance - Fatal编程技术网

C# 这些类是否可以实现这些接口?

C# 这些类是否可以实现这些接口?,c#,generics,interface,covariance,C#,Generics,Interface,Covariance,我正在尝试创建以下类 但我正在努力获得几个视图模型类来实现接口,如下所述 数据模型类: public interface IPage { string PageTitle { get; set; } string PageContent { get; set; } } public interface IDatedPage : IPage { DateTime PageDate { get; set; } } public abstract class Pa

我正在尝试创建以下类

但我正在努力获得几个视图模型类来实现接口,如下所述

数据模型类:

public interface IPage
{
    string PageTitle { get; set; }
    string PageContent { get; set; }
}
public interface IDatedPage
    : IPage
{
    DateTime PageDate { get; set; }
}



public abstract class Page
    : IPage
{
    public string PageTitle { get; set; }
    public string PageContent { get; set; }
}
public abstract class DatedPage
    : Page
    , IDatedPage
{
    public DateTime PageDate { get; set; }
}



public class AboutPage
    : Page
    , IPage
{
}
public class NewsPage 
    : DatedPage
    , IDatedPage
{
}
public interface IPageAdminViewModel<T>
    where T : IPage
{
    IPagedList<T> Pages { get; set; }
}
public interface IDatedPageAdminViewModel<T>
    : IPageAdminViewModel<T>
    where T : IDatedPage
{
}


public abstract class PageAdminViewModel<T>
    : IPageAdminViewModel<T>
    where T: IPage
{
    public IPagedList<T> Pages { get; set; }
}
public abstract class DatedPageAdminViewModel<T>
    : PageAdminViewModel<T>
    , IDatedPageAdminViewModel<T>
    where T : IDatedPage
{
}


public class AboutPageAdminViewModel
    : PageAdminViewModel<AboutPage>
    , IPageAdminViewModel<IPage>
{
}

public class NewsPageAdminViewModel
    : DatedPageAdminViewModel<NewsPage>
    , IDatedPageAdminViewModel<IDatedPage>
{
}
相关视图模型类:

public interface IPage
{
    string PageTitle { get; set; }
    string PageContent { get; set; }
}
public interface IDatedPage
    : IPage
{
    DateTime PageDate { get; set; }
}



public abstract class Page
    : IPage
{
    public string PageTitle { get; set; }
    public string PageContent { get; set; }
}
public abstract class DatedPage
    : Page
    , IDatedPage
{
    public DateTime PageDate { get; set; }
}



public class AboutPage
    : Page
    , IPage
{
}
public class NewsPage 
    : DatedPage
    , IDatedPage
{
}
public interface IPageAdminViewModel<T>
    where T : IPage
{
    IPagedList<T> Pages { get; set; }
}
public interface IDatedPageAdminViewModel<T>
    : IPageAdminViewModel<T>
    where T : IDatedPage
{
}


public abstract class PageAdminViewModel<T>
    : IPageAdminViewModel<T>
    where T: IPage
{
    public IPagedList<T> Pages { get; set; }
}
public abstract class DatedPageAdminViewModel<T>
    : PageAdminViewModel<T>
    , IDatedPageAdminViewModel<T>
    where T : IDatedPage
{
}


public class AboutPageAdminViewModel
    : PageAdminViewModel<AboutPage>
    , IPageAdminViewModel<IPage>
{
}

public class NewsPageAdminViewModel
    : DatedPageAdminViewModel<NewsPage>
    , IDatedPageAdminViewModel<IDatedPage>
{
}
但它给了我一个错误:

无效差异:类型参数“T”在“IPageAdminViewModel.Pages”上必须始终有效T’是协变的

它不允许我将
out
添加到
.Pages
属性:

方差修饰符无效。只能将接口和委托类型参数指定为变量


我的尝试2:

我了解了这一点,所以我尝试将所有
IPagedList
属性更改为
IEnumerable
。但我仍然在努力

“AboutPageAdminViewModel”未实现接口成员“IPageAdminViewModel.Pages”PageAdminViewModel

公共类关于GeAdminViewModel
:PageAdminViewModel
,IPageAdminViewModel
{
}

您对类的两个约束相互矛盾
PageAdminViewModel
表示
Pages
集合返回一组
AboutPage
s,并且只接受
AboutPage
。而,
IPageAdminViewModel
表示
Pages
返回任何
IPage
,也可以获取任何
IPage
。因此,虽然一个约束只保证
关于IPage
的信息,但另一个约束为任何
IPage
打开了大门。简而言之,不允许,如果允许,您可以从
Pages
集合中获取
ProfilePage
,因为它也是
IPage
。获得这两种行为的唯一方法是分别实现每个
页面
集合。

为什么要在继承自实现它们的类的类上实现接口?我通常不会,但是将它显式地添加到类中可以让我看到在修改代码时错误消息是否发生了变化。为什么要进行向下投票?我很乐意得到一个解释,因为这个问题没有违反我所知道的任何指导原则。你能发布你的IPagedList界面吗(我不知道是否有否决票)?可能重复“总之不允许”-残酷的事实:(谢谢解释