2010-06-03 64 views
2

我試圖在using語句中使用泛型類,但編譯器似乎無法將其視爲實現IDisposable。在使用語句中不能使用通用C#類

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' 

我實現了IDisposable上UnitOfWorkScope(並看看是否這就是問題所在,也MyObjectContext)。

我錯過了什麼?

回答

13

我實現了IDisposable上UnitOfWorkScope

不,你沒有。你指定你的T應該實現IDisposable。

使用此語法:

public sealed class UnitOfWorkScope<T> : IDisposable where T : ObjectContext, IDisposable, new() 

因此,首先聲明一下類/接口UnitOfWorkScope器械(IDisposable接口),然後宣佈T的約束(T必須從ObjectContext的派生,實現IDisposable,有一個參數的構造函數)

+0

+1 - 確切地說。 UnitOfWorkScope不在給定的源中實現IDisposable。 – TomTom 2010-06-03 05:48:23

5

你指定在UnitOfWorkScope<T>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... 
    } 
} 
4

你已經實現了IDisposable的一切,除了你需要實現它是什麼:UnitOfWorkScope<T>實現Dispose方法,但絕不實現IDisposable。 where子句適用於T,不適用於班級。