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>();