“...”无法实现接口成员,因为它不是公共的

时间:2014-02-14 15:32:33

标签: c# entity-framework dbcontext

public interface IDatabaseContext : IDisposable {

    IDbSet<MyEntity1> Entities1 { get; set; }

}

public class MyDbContext : DbContext, IDatabaseContext {

    IDbSet<MyEntity1> Entities1 { get; set; }

}

由于此处描述的错误而导致无法编译:http://msdn.microsoft.com/en-Us/library/bb384253(v=vs.90).aspx

然而,由于界面显然是公开的,所以没有任何意义。这可能是什么错误?

5 个答案:

答案 0 :(得分:19)

  

然而,由于界面显然是公开的,所以没有任何意义。这可能是什么错误?

不,不是。默认情况下,课程成员为private。这个Entities1是私有的:

public class MyDbContext : DbContext, IDatabaseContext {    
    IDbSet<MyEntity1> Entities1 { get; set; }    
}

请注意,这与interface不同,其中所有内容均为public,访问修饰符无意义。所以:要么成员public

public class MyDbContext : DbContext, IDatabaseContext {    
    public IDbSet<MyEntity1> Entities1 { get; set; }    
}

或执行显式接口实现:

public class MyDbContext : DbContext, IDatabaseContext {    
    IDbSet<MyEntity1> IDatabaseContext.Entities1 { get; set; }    
}

答案 1 :(得分:4)

在课程中实现界面成员时,应该是public

请参阅:Interfaces (C# Programming Guide)

  

实现接口成员,对应的成员   实现类必须是公共的,非静态的,并具有相同的   名称和签名作为接口成员。

public class MyDbContext : DbContext, IDatabaseContext {

    public IDbSet<MyEntity1> Entities1 { get; set; }
}

或者@Marc Gravell在评论中说你可以Explicit interface implemenation,可以在this answer找到更多

答案 2 :(得分:0)

为简化答案/逻辑-

您的问题是接口想要在继承类中公开(这就是为什么它被称为接口)的原因。

因此,您必须将派生类中的实现标记为public(在MyDbContext中)。

答案 3 :(得分:0)

我遇到了同样的问题,只是发现我忘记公开接口的方法。确保接口的所有方法也是公开的。

答案 4 :(得分:-1)

接口成员也可以实现为受保护。 如果您不希望我们可以在抽象类的情况下将其保留为抽象。

相关问题