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