编译错误:“显式实现接口时,”修饰符“public”对此项“无效”

我得到这个错误,同时创build一个类的public方法显式实现interface 。 我有一个解决方法:通过删除PrintName方法的显式实现。 但我很惊讶,为什么我得到这个错误。

任何人都可以解释错误?

代码库:

 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test.Lib1 { public class Customer : i1 { public string i1.PrintName() //Error Here... { return this.GetType().Name + " called from interface i1"; } } public interface i1 { string PrintName(); } interface i2 { string PrintName(); } } 

控制台testing应用程序代码:

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Test.Lib1; namespace ca1.Test { class Program { static void Main(string[] args) { Customer customer = new Customer(); Console.WriteLine(customer.PrintName()); //i1 i1o = new Customer(); //Console.WriteLine(i1o.printname()); //i2 i2o = new Customer(); //Console.WriteLine(i2o.printname()); } } } 

当使用接口的显式实现时,成员被迫在类本身中比私有更受限制。 而当访问修饰符被强制时,你可能不会添加一个。

同样,在界面本身,所有成员都是公开的 。 如果您尝试在界面中添加修改器,则会出现类似的错误。

为什么明确的成员(非常)是私人的? 考虑:

 interface I1 { void M(); } interface I2 { void M(); } class C : I1, I2 { void I1.M() { ... } void I2.M() { ... } } C c = new C(); cM(); // Error, otherwise: which one? (c as I1).M(); // Ok, no ambiguity. 

如果这些方法是公开的,那么您将会遇到无法通过正常重载规则解决的名称冲突。

出于同样的原因,你甚至不能从class C成员中调用M() 。 您必须首先将this转换为特定的接口,以避免相同的歧义。

 class C : I1, I2 { ... void X() { M(); // error, which one? ((I1)this).M(); // OK } } 

http://msdn.microsoft.com/en-us/library/aa288461(VS.71).aspx :当一个成员被明确地实现时,它不能通过一个类实例被访问,而只能通过该接口的一个实例来访问。

 Customer customer = new Customer(); 

Console.WriteLine(customer.PrintName());

违反这一点

显式实现接口时,不能使用访问修饰符。 成员将被绑定到接口,所以不需要指定访问修饰符,因为所有的接口成员都是公共的,所有显式实现的成员也只能通过接口types的成员来访问(见statichippo的答案)。

当我们想要对上面的例子进行隐式实现时,以下是代码。

  interface I1 { void M(); } interface I2 { void M(); } class C : I1, I2 { public void M() { ... } } C c = new C(); cM(); // Ok, no ambiguity. Because both Interfaces gets implemented with one method definition.