无法理解为什么会出现 "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.
}
}
我正在使用 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.
}
}