在使用Statement中不能使用Generic C#Class

时间:2010-06-03 05:39:59

标签: c# generics idisposable

我正在尝试在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上查看是否存在问题)。

我错过了什么?

3 个答案:

答案 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 ,而不适用于类。