Метод наследуемого интерфейса не может быть явно объявлен как «открытый» - PullRequest
1 голос
/ 02 марта 2012

кто-нибудь может дать быстрый ответ для меня ...

в следующем совершенно бесполезном коде в разделе «класс DuplicateInterfaceClass: MyInterface1, MyInterface2».

Почему я не могу явно написать "публичную строку MyInterface2.P ()"?
все же "открытая строка P ()" и "строка MyInterface2.P ()" работают.

Я понимаю, что все методы интерфейса (свойства и т. Д.) По умолчанию неявно являются "публичными", но моя попытка быть явной в наследующем классе приводит к "ошибке CS0106: модификатор" public "недопустим для этого" пункт».

using System;

interface MyInterface1
{
    void DuplicateMethod();

    // interface property
    string P
    {   get;    }
}

interface MyInterface2
{
    void DuplicateMethod();

    // function ambiguous with MyInterface1's property
    string P();
}

// must implement all inherited interface methods
class DuplicateInterfaceClass : MyInterface1, MyInterface2
{
    public void DuplicateMethod()
    {
        Console.WriteLine("DuplicateInterfaceClass.DuplicateMethod");
    }

    // MyInterface1 property
    string MyInterface1.P
    {   get
        {   return ("DuplicateInterfaceClass.P property");  }
    }

    // MyInterface2 method
    // why? public string P()...and not public string MyInterface2.P()?
    string MyInterface2.P()
    {   return ("DuplicateInterfaceClass.P()"); }

}

class InterfaceTest
{
    static void Main()
    {
        DuplicateInterfaceClass test = new DuplicateInterfaceClass();       
        test.DuplicateMethod();     

        MyInterface1 i1 = (MyInterface1)test;
        Console.WriteLine(i1.P);

        MyInterface2 i2 = (MyInterface2)test;
        Console.WriteLine(i2.P());
    }
}

1 Ответ

1 голос
/ 02 марта 2012

У меня есть это явное сообщение от Resharper: «Модификатор public» недопустим для явной реализации интерфейса. »

Но вы можете сделать это:

class DuplicateInterfaceClass : MyInterface1, MyInterface2
{
 public void DuplicateMethod()
 {
  Console.WriteLine("DuplicateInterfaceClass.DuplicateMethod");
 }

 string MyInterface1.P
 { get { return "DuplicateInterfaceClass.P"; } }

 string MyInterface2.P()
 { return "DuplicateInterfaceClass.P()"; }

 public string P()
 { return ((MyInterface2)this).P(); }
}
...