Почему этот метод реализации не видит своего родного брата?

У меня есть класс, который реализует интерфейс:

public class SQLiteHHSDBUtils : IHHSDBUtils
{

    void IHHSDBUtils.SetupDB()
    {
            . . .
            if (!TableExists("AppSettings"))

    . . .

    bool IHHSDBUtils.TableExists(string tableName)
    {
    . . .

Он не может найти своего собственного брата, сидящего прямо под ним (if (!TableExists()):

Имя "TableExists" не существует в текущем контексте

Как это может / почему не видит?

3 ответа

Решение

У вас есть явная реализация интерфейса. Вы не можете получить доступ к вашим интерфейсным методам напрямую, если вы не приведете текущий экземпляр к типу интерфейса:

if (!((IHHSDBUtils)this).TableExists("AppSettings"))

Из 13.4.1 Явные реализации членов интерфейса

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

Когда вы явно реализуете интерфейс, вам нужно получить доступ к члену интерфейса из переменной, тип которой является именно интерфейсом (а не типом реализации).

if (!TableExists("AppSettings")) звонит TableExists через this объект, тип которого SQLiteHHSDBUtilsне IHHSDBUtils,

Пытаться:

if (!((IHHSDBUtils)this).TableExists("AppSettings"))

В качестве альтернативы, не реализуйте интерфейс явно:

public class SQLiteHHSDBUtils : IHHSDBUtils
{
    // .. 
    bool TableExists(string tableName)
    {
        // ..

TableExists явная реализация. Если вы хотите получить к нему доступ, вы должны разыграть this в IHHSDBUtils:

void IHHSDBUtils.SetupDB()
{
    . . . 
    if (!((IHHSDBUtils)this).TableExists("AppSettings"))
Другие вопросы по тегам