c# - 不能同时指定约束类和 0​​x104567910 或 'class' 约束

标签 c# generics

我正在尝试解决 mocking issue通过创建 IDbSet 的自定义模拟。

自定义模拟:

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

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

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

cannot specify both a constraint class and the 'class' or 'struct' constraint

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

The constraints for type parameter 'TDerivedEntity' of method 'Tests.DAL.Tenants.DbSetMock.Create<TDerivedEntity>()' must match the constraints for type parameter 'TDerivedEntity' of interface method 'System.Data.Entity.IDbSet<BusinessLayer.DAL.Tenants.Tenant>.Create<TDerivedEntity>()'. Consider using an explicit interface implementation instead.

任何人都可以帮助我成功地构建这个类吗?

最佳答案

由于 TDerived 类型参数被限制为 Tenant,因此添加约束 classstruct 是多余的。只需删除 class 约束即可。

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

public class DbSetMock : IDbSet<Tenant>
{

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

}

如果不使用显式接口(interface)实现,似乎无法实现该方法。如果您需要它作为类的公共(public)接口(interface)的一部分,我建议创建接口(interface)实现转发到的另一个方法:

public class DbSetMock : IDbSet<Tenant>
{

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

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

}

关于c# - 不能同时指定约束类和 0​​x104567910 或 'class' 约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14418071/

相关文章:

c# - 使用 Entity Framework 从动态创建的表中查询数据

java - JDK7泛型未编译

c# 泛型约束哪里不是类?

c# - 如何将 DataTable 保存到 .DBF?

java - 泛型并在 Java 中转换

java - 如何在没有警告的情况下将通用工厂用于通用类型?

java - 访问 gdx.utils.Array 会引发 ClassCastException

c# - 在类里面使用相同类型的列表是一个好的做法吗?

c# - Task.WaitAny 的重载版本是否取消任务?

c# - Xamarin essentials 地理定位不起作用,GetLocationAsync 中断尝试