在基于泛型的变量的变量赋值中键入不匹配

时间:2014-01-07 12:36:10

标签: c# entity-framework

有谁知道为什么C#似乎不喜欢下面的代码?

问题是MyContext由于其类型不匹配而无法分配到_context变量,但MyContextDbContext派生(继承?),因此肯定会满足generics where子句吗?

public class UnitOfWork<TContext> : IUnitOfWork<TContext> where TContext : DbContext
{
    private TContext _context;

    public UnitOfWork()
    {
        _context = new MyContext(Common.ConfigurationProvider.DatabaseConnectionString);
    }
...

}

2 个答案:

答案 0 :(得分:2)

这是不允许的,因为where TContext : DbContext约束承诺TContext将是DbContext而不是MyContext

换句话说,TContext可能是MyContext2,与MyContext没有继承关系。所以编译器不满意:(

如果您打算使用特定的上下文MyContext,那么IMO您不需要泛型。

<小时/> 编辑:如果您确定您的上下文将是类型参数(TContext)的后代,那么您可以发挥一个技巧使其工作,

public UnitOfWork()
{
    _context = (TContext)(object)new MyContext(...);
}

但是,在生产代码中使用它之前我会三思而后行。如果MyContext不是TContext或其后代,则会失败。

答案 1 :(得分:0)

TContext可能是继承自DbContext的{​​{1}}与MyContext类型不兼容的另一种类型。