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

问题描述 投票:8回答:5
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

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

c# entity-framework dbcontext
5个回答
21
投票

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

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

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

请注意,这与interfaces不同,其中一切都是public,访问修饰符没有意义。所以:要么成为成员public

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

或者做一个明确的接口实现:

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

4
投票

在类中实现接口成员时,它应该是public

见:Interfaces (C# Programming Guide)

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

public class MyDbContext : DbContext, IDatabaseContext {

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

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


0
投票

简化答案/逻辑 -

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

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


0
投票

我有同样的问题才发现我忘了将界面的方法公之于众。确保界面的所有方法都是公开的。


-1
投票

接口成员也可以实现为受保护。如果你不想要我们可以在抽象类的情况下将它作为抽象。

© www.soinside.com 2019 - 2024. All rights reserved.