Почему этот метод реализации не видит своего родного брата?
У меня есть класс, который реализует интерфейс:
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"))