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
然而,由于界面显然是公开的,所以没有任何意义。这可能是什么错误?
答案 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)
接口成员也可以实现为受保护。 如果您不希望我们可以在抽象类的情况下将其保留为抽象。