c#7当对方法参数使用泛型时,我得到类型参数的约束';U';方法的类型必须与接口的约束匹配

c#7当对方法参数使用泛型时,我得到类型参数的约束';U';方法的类型必须与接口的约束匹配,c#,generics,interface,.net-core,asp.net-core-mvc-2.0,C#,Generics,Interface,.net Core,Asp.net Core Mvc 2.0,我试图创建一个接口和一个具体的实现,其中接口是泛型类型,其中一个方法具有泛型参数 我想保留GetPagedList方法参数resourceParams,generic,以便为接口的不同实现传入不同的resourceParams对象 当使用下面显示的代码时,我得到了错误 方法“ShippingServicesRepository.GetPagedList(U)”的类型参数“U”的约束必须与接口方法IBaseRepository.GetPagedList(U)的类型参数“U”的约束匹配。考虑使用显式

我试图创建一个接口和一个具体的实现,其中接口是泛型类型,其中一个方法具有泛型参数

我想保留GetPagedList方法参数resourceParams,generic,以便为接口的不同实现传入不同的resourceParams对象

当使用下面显示的代码时,我得到了错误

方法“ShippingServicesRepository.GetPagedList(U)”的类型参数“U”的约束必须与接口方法IBaseRepository.GetPagedList(U)的类型参数“U”的约束匹配。考虑使用显式接口实现而不是

这是我的界面

public interface IBaseRepository<T> 
{
    bool Save();
    bool Exists(int recordId);
    bool MarkForDeletion(int recordId);
    PagedList<T> GetPagedList<U>(U resourceParams) where U : class;
    T Get(int id);
    void Add(T record);
    void Update(T record);
}
以下是ShippingServicesResourceParameters继承的BaseResourceParameters类

public class BaseResourceParameters
{
    private int _pageSize;
    public int PageNumber { get; set; } = 1;
    public int PageSize
    {
        get
        {
            return _pageSize;
        }
        set
        {
            _pageSize = (value > MaxPageSize) ? MaxPageSize : value;
            if (value == 0)
            {
                _pageSize = 10; // set a default size
            }
        }
    }

    public int MaxPageSize { get; set; } = 20;
    public bool DeleteFlag { get; set; }
    public string SearchQuery { get; set; }
    public string OrderBy { get; set; } = "Id";
    public string Fields { get; set; }
}
如果我没有将“where U:ShippingServicesResourceParameters”添加到具体实现中的方法签名和接口中的“where U:class”,则在具体实现中首次使用resourceParams变量时会出现“无法从方法组转换为字符串…”错误。(位于“.ApplySort(resourceParams.OrderBy”)


我在这里遗漏了什么?

让我们做一下您首先应该做的事情,并制作一个演示问题的最小程序:

interface I 
{
    void M<U>(U u) where U : class;
}
class D 
{
    public void O() {}
}
class C : I
{
    public void M<U>(U u) where U : D
    {
        u.O();
    }
}
现在我们都好了

您需要使实现约束与接口约束相匹配,就像您需要满足接口强加的所有其他要求一样。接口是合同。您必须完成交易


我注意到错误消息是这样说的:您必须匹配约束,但您没有这样做。请注意错误消息;大多数情况下,它们会告诉您错误所在。

在方法中使用具体类时,所有泛型的原因是什么?@MikePerrenoud您不能使用另一个类约束指定类。p请制作一个大约是这个复制的二十分之一大小的复制。这里有大量完全不相关的积垢需要处理。错误消息告诉您问题的确切原因。您正在编写的方法有哪些约束?您希望它实现的接口实现有哪些约束?它们是相同的吗?(提示,它们不是,错误消息告诉您同样多。)不要随意改变约束条件,希望约束条件能解决问题。这不是一种可靠的工程方法。先理解问题,然后再解决问题。谢谢你的解释,我也感谢你花时间来制定答案。@Eieguy:不客气。如果还不清楚,就这样想。假设你有e> 界面I{void M(动物a);}你不能说,哦,嘿,我想实现
I
,但是让
M
只接受
Giraffe
I
的合同是
M
可以接受任何
动物,如果你想实现
I
,这是一项要求。在你的情况下,你对方法的要求是
U
可以用任何引用类型构造。你不能说“好吧,在我的实现中,
U
只能用
ShippingServicesResourceParameters
后代类型构造,原因相同。
public class BaseResourceParameters
{
    private int _pageSize;
    public int PageNumber { get; set; } = 1;
    public int PageSize
    {
        get
        {
            return _pageSize;
        }
        set
        {
            _pageSize = (value > MaxPageSize) ? MaxPageSize : value;
            if (value == 0)
            {
                _pageSize = 10; // set a default size
            }
        }
    }

    public int MaxPageSize { get; set; } = 20;
    public bool DeleteFlag { get; set; }
    public string SearchQuery { get; set; }
    public string OrderBy { get; set; } = "Id";
    public string Fields { get; set; }
}
interface I 
{
    void M<U>(U u) where U : class;
}
class D 
{
    public void O() {}
}
class C : I
{
    public void M<U>(U u) where U : D
    {
        u.O();
    }
}
I i = new C();
i.M<Giraffe>(new Giraffe());
    public void M<U>(U u) where U : class
    {
        u.O();
    }
interface I 
{
    void M<U>(U u) where U : D;
}
class D 
{
    public void O() {}
}
class C : I
{
    public void M<U>(U u) where U : D
    {
        u.O();
    }
}