Не могу понять, почему получение «типа, используемого в операторе using, должно быть неявно преобразовано в ошибку« System.IDisposable »» - PullRequest
0 голосов
/ 19 сентября 2019

Я использую Visual Studio 2010, .NET Framework 4.

Я получаю тип , используемый в операторе using, должен быть неявно преобразован в ошибку 'System.IDisposable' , хотя яреализации IDisposable, поэтому я не уверен, где я делаю ошибку.Пожалуйста, проверьте и дайте мне знать.

У меня есть класс с именем MyDatabaseContext, который содержит DbConnection;он реализует IDisposable:

public abstract class MyDatabaseContext : IDisposable
{
   private string _dataProvider;
   private string _connectionString;
   private DbConnection _dbConnection;

   public MyDatabaseContext(string dataProvider, string connectionString)
   {
      _dataProvider = dataProvider;
      _connectionString = connectionString;
   }

   public void OpenConnection()
   {
      DbProviderFactory dbProviderFactory = DbProviderFactories.GetFactory(_dataProvider);
      _dbConnection = dbProviderFactory.CreateConnection();
      _dbConnection.ConnectionString = _connectionString;
      _dbConnection.Open();
   }

   public void Dispose()
   {
      if (_dbConnection != null)
      {
         if (_dbConnection.State != ConnectionState.Closed)
         {
            _dbConnection.Close();
         }
         _dbConnection.Dispose();
         _dbConnection = null;
      }
   }
}

Теперь у меня есть класс EmployeeDatabaseContext, который наследуется от MyDatabaseContext.В нем у меня есть метод test () , где я вызываю метод OpenConnection () родительского класса внутри блока using.

public class EmployeeDatabaseContext : MyDatabaseContext
{
   public EmployeeDatabaseContext(string dataProvider, string connectionString)
            : base(dataProvider, connectionString)
   {
   }

   public void test()
   {
      using (OpenConnection())
      {
      }
   }
}

Проблема в том, что я получаю ошибку при сборке.Ошибка в классе EmployeeDatabaseContext в методе test () в блоке using.Ошибка:

'void': тип, используемый в операторе using, должен быть неявно преобразован в 'System.IDisposable'

Но родительский класс MyDatabaseContext реализуетIDisposable, поэтому я не знаю, почему я получаю эту ошибку.

Спасибо

1 Ответ

3 голосов
/ 19 сентября 2019

OpenConnection() возвращает недействительным.Чтобы использовать его в операторе using, необходимо вернуть объект, который реализует IDisposable.Неважно, что реализует класс, принадлежащий методу.Заявление об использовании не уходит, ища что-то поблизости, чтобы избавиться.Он распоряжается именно тем, что вы ему даете, и вы ничего ему не даете.

Итак:

public MyDatabaseContext(string dataProvider, string connectionString)
{
    _dataProvider = dataProvider;
    _connectionString = connectionString;

    OpenConnection();
}

Но пусть OpenConnection() не будет публичным, поскольку вы не хотите, чтобы нарушителиизбыточный вызов:

protected void OpenConnection()
{
    // ...
}

Вы правильно вызываете базовый конструктор в конструкторе EmployeeDatabaseContext, так что все в порядке.

А вот как вы используете его в выражении использования:

public void test()
{
    using (var ctxt = new EmployeeDatabaseContext(someProviderString, someConnString))
    {
        //  Do stuff with ctxt
        //  ctxt.Dispose() will be called when control exits this block. 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...