无法同时指定约束类和"类"或"结构"约束

bas*_*bas 11 c# generics

我试图解决一个嘲讽的问题,通过创建IDbSet自定义模拟.

自定义模拟:

public class DbSetMock : IDbSet<Tenant>
{
    /* hidden all other implemented methods/properties */

    public TDerivedEntity Create<TDerivedEntity>() where TDerivedEntity : class, Tenant
    {
        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)

create方法给出了一个构建错误,我不知道如何解决:

不能同时指定约束类和'class'或'struct'约束

简单地class从约束中删除会导致另一个构建错误(我也不明白:()).

方法'Tests.DAL.Tenants.DbSetMock.Create <TDerivedEntity>()'的类型参数'TDerivedEntity'的约束必须与接口方法'System.Data.Entity.IDbSet <BusinessLayer'的类型参数'TDerivedEntity'的约束匹配. DAL.Tenants.Tenant> .Create <TDerivedEntity>()".请考虑使用显式接口实现.

有人可以帮我成功建立这门课吗?

Jor*_*dão 14

由于TDerived类型参数被约束为a Tenant,因此添加约束class或者struct是冗余的.只需删除class约束.

更新:奇怪的是,这里的编译器错误之间似乎存在冲突.如果你"修复"一个你得到另一个,在一个无限的绝望循环.幸运的是,第二个错误也为我们提供了一条出路:您可以使用显式接口实现:

public class DbSetMock : IDbSet<Tenant>
{

    TDerivedEntity IDbSet<Tenant>.Create<TDerivedEntity>()
    {
        throw new NotImplementedException();
    }

}
Run Code Online (Sandbox Code Playgroud)

似乎是没有办法实施该方法使用显式接口实现.如果你需要它作为类的公共接口的一部分,我建议创建另一个方法,接口实现转发到:

public class DbSetMock : IDbSet<Tenant>
{

    TDerivedEntity IDbSet<Tenant>.Create<TDerivedEntity>()
    {
        return Create<TDerivedEntity>();
    }

    public TDerivedEntity Create<TDerivedEntity>() where TDerivedEntity : Tenant
    {
        throw new NotImplementedException();
    }

}
Run Code Online (Sandbox Code Playgroud)