C# 实现通用接口和非通用接口
我有两个合同(一个通用接口,另一个非通用接口),如下所示:C# 实现通用接口和非通用接口,c#,generics,C#,Generics,我有两个合同(一个通用接口,另一个非通用接口),如下所示: public interface IGenericContract<T> where T : class { IQueryable<T> GetAll(); } public interface INonGenericContract { string GetFullName(Guid guid); } 公共接口IGenericContract
public interface IGenericContract<T> where T : class
{
IQueryable<T> GetAll();
}
public interface INonGenericContract
{
string GetFullName(Guid guid);
}
公共接口IGenericContract,其中T:class
{
IQueryable GetAll();
}
NGenericContract中的公共接口
{
字符串GetFullName(Guid);
}
我有一个实现这两者的类
public class MyClass<T> :
IGenericContract<T> where T : class, INonGenericContract
{
public IQueryable<T> GetAll()
{
...
}
public string GetFullName(Guid guid)
{
...
}
}
公共类MyClass:
IGenericContract,其中T:class,INonGenericContract
{
公共IQueryable GetAll()
{
...
}
公共字符串GetFullName(Guid)
{
...
}
}
在我编译它之前,一切都很好。
但是现在当我尝试使用这个类时,我遇到了这个错误
“错误CS0311:类型'string'不能用作泛型类型或方法'ConsoleApplication1.MyClass'中的类型参数'T'。没有从'string'到'ConsoleApplication1.InOngenenericContract'的隐式引用转换。”
类程序
{
静态void Main(字符串[]参数)
{
MyClass MyClass=新建MyClass();//错误
}
}
如果我不执行非通用合同,它可以正常工作。这里可能出了什么问题
谢谢你所展示的
public class MyClass<T> : IGenericContract<T> where T : class, INonGenericContract
因为
IGenericContract
已经具有该约束,所以不需要有where T:class
。在您的代码中INonGenericContract
是通用约束的一部分,因为它位于where
之后
public class MyClass<T> :
IGenericContract<T> where T : class, INonGenericContract
公共类MyClass:
IGenericContract,其中T:class,INonGenericContract
您可能希望:
public class MyClass<T> :
IGenericContract<T>, INonGenericContract where T : class
公共类MyClass:
IGenericContract,INonGenericContract,其中T:类
您非常接近,您要做的是实现非通用接口,而不是设置约束
public class MyClass<T> :
IGenericContract<T>, INonGenericContract where T : class
{
public IQueryable<T> GetAll()
{
return null;
}
public string GetFullName(Guid guid)
{
return null;
}
}
公共类MyClass:
IGenericContract,INonGenericContract,其中T:类
{
公共IQueryable GetAll()
{
返回null;
}
公共字符串GetFullName(Guid)
{
返回null;
}
}
现在你可以这样做了
MyClass<string> myClass = new MyClass<string>();
MyClass MyClass=新的MyClass();
public class MyClass<T> :
IGenericContract<T>, INonGenericContract where T : class
{
public IQueryable<T> GetAll()
{
return null;
}
public string GetFullName(Guid guid)
{
return null;
}
}
MyClass<string> myClass = new MyClass<string>();