无法理解为什么会出现 "type used in a using statement must be implicitly convertible to 'System.IDisposable'" 错误

Cannot understand why getting "type used in a using statement must be implicitly convertible to 'System.IDisposable'" error

我正在使用 Visual Studio 2010,.NET Framework 4。

我得到 type used in a using statement must be implicitly convertible to 'System.IDisposable' 错误虽然我正在实施 IDisposable 所以我不确定我在哪里犯了错误.请检查并让我知道。

我有一个名为 MyDatabaseContext 的 class,其中包含 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;
      }
   }
}

现在我有一个继承自 MyDatabaseContext 的 class EmployeeDatabaseContext。在其中我有一个方法 test(),我在其中调用父 class 的 OpenConnection() 方法 using 块。

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

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

问题是我在构建时遇到错误。 using 块上的 test() 方法中的 EmployeeDatabaseContext class 出错。错误是

'void': type used in a using statement must be implicitly convertible to 'System.IDisposable'

但是父 class MyDatabaseContext 正在实施 IDisposable 所以我不知道为什么会出现此错误。

谢谢

OpenConnection()return作废。要在 using 语句中使用它,它需要 return 一个实现 IDisposable 的对象。该方法实现的 class 是什么并不重要。 using 语句不会停止寻找附近的东西来处理。它完全处理你给它的东西,而你没有给它任何东西。

所以:

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

    OpenConnection();
}

但让 OpenConnection() 不是 public,因为您不希望闯入者冗余地调用它:

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

您在 EmployeeDatabaseContext 的构造函数中正确地调用了基构造函数,所以没问题。

下面是如何在 using 语句中使用它:

public void test()
{
    using (var ctxt = new EmployeeDatabaseContext(someProviderString, someConnString))
    {
        //  Do stuff with ctxt
        //  ctxt.Dispose() will be called when control exits this block. 
    }
}