Ошибка компиляции: “Модификатор 'общественность' не допустим для этого объекта”, явно реализовывая интерфейс

Я получаю эту ошибку при создании a 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();
    }
}

Код для консольного тестового приложения:

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());

        }
    }
}
58
задан Lalit 21 December 2016 в 02:33
поделиться

3 ответа

При использовании явная реализация интерфейса, члены вынуждены выполнять что-то более ограниченное, чем частное в самом классе. А когда модификатор доступа принудительный, вы не можете его добавить.

Аналогичным образом, в самом интерфейсе все члены являются общедоступными . Если вы попытаетесь добавить модификатор внутри интерфейса, вы получите аналогичную ошибку.

Почему явные члены (очень) частные? Примите во внимание:

interface I1 { void M(); }
interface I2 { void M(); }

class C : I1, I2
{
    void I1.M() { ... }
    void I2.M() { ... }
}

C c = new C();
c.M();         // Error, otherwise: which one?
(c as I1).M(); // Ok, no ambiguity. 

Если бы эти методы были общедоступными, вы бы столкнулись с конфликтом имен, который нельзя разрешить обычными правилами перегрузки.

По той же причине нельзя даже вызвать M () изнутри члена класса C . Сначала вам нужно будет преобразовать this в конкретный интерфейс, чтобы избежать такой же двусмысленности.

class C : I1, I2
{
   ...
   void X() 
   {  
     M();             // error, which one? 
     ((I1)this).M();  // OK 
   }
}
72
ответ дан 24 November 2019 в 19:02
поделиться

http://msdn.microsoft.com/en-us/library/aa288461 (VS.71) .aspx : Когда член реализован явно, к нему нельзя получить доступ через класс экземпляр, но только через экземпляр интерфейса.

Customer customer = new Customer();

Console.WriteLine (customer.PrintName ());

Нарушает это

11
ответ дан 24 November 2019 в 19:02
поделиться

Вы не можете использовать модификаторы доступа при явной реализации интерфейса. Член будет привязан к интерфейсу в любом случае, поэтому нет необходимости указывать модификатор доступа, потому что все члены интерфейса всегда общедоступны, а также все явно реализованные члены могут быть доступны только через член типа интерфейса (см., Например, ответ statichippo).

7
ответ дан 24 November 2019 в 19:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: