我正在尝试在using
语句中使用泛型类,但编译器似乎无法将其视为实现IDisposable。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Objects;
namespace Sandbox
{
public sealed class UnitOfWorkScope<T> where T : ObjectContext, IDisposable, new()
{
public void Dispose()
{
}
}
public class MyObjectContext : ObjectContext, IDisposable
{
public MyObjectContext() : base("DummyConnectionString") { }
#region IDisposable Members
void IDisposable.Dispose()
{
throw new NotImplementedException();
}
#endregion
}
public class Consumer
{
public void DoSomething()
{
using (new UnitOfWorkScope<MyObjectContext>())
{
}
}
}
}
编译错误是:
Error 1 'Sandbox.UnitOfWorkScope<Sandbox.MyObjectContext>': type used in a using statement must be implicitly convertible to 'System.IDisposable'
我在UnitOfWorkScope上实现了IDisposable(并且在MyObjectContext上查看是否存在问题)。
我错过了什么?
答案 0 :(得分:13)
我在UnitOfWorkScope上实现了IDisposable
不,你没有。您指定您的T应该实现IDisposable。
使用以下语法:
public sealed class UnitOfWorkScope<T> : IDisposable where T : ObjectContext, IDisposable, new()
首先,声明UnitOfWorkScope实现的类/接口(IDisposable),然后声明T的约束(T必须从ObjectContext派生,实现IDisposable并具有无参数构造函数)
答案 1 :(得分:5)
您已指定T
中的UnitOfWorkScope<T>
必须实施IDisposable
,但不是UnitOfWorkScope<T>
本身实施IDisposable
。我想你想要这个:
public sealed class UnitOfWorkScope<T> : IDisposable
where T : ObjectContext, IDisposable, new()
{
public void Dispose()
{
// I assume you'll want to call IDisposable on your T here...
}
}
答案 2 :(得分:4)
除了您需要实现的内容外,您已经在所有内容上实现了IDisposable:UnitOfWorkScope<T>
实现了Dispose方法,但从未实现IDisposable 。 where子句适用于 T ,而不适用于类。