2010-06-03 3 views
2

J'essaie d'utiliser une classe générique dans une instruction using, mais le compilateur ne semble pas la traiter comme implémentant IDisposable.Impossible d'utiliser la classe C# générique dans l'instruction Statement

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>()) 
      { 
      } 
     } 
    } 
} 

erreur du compilateur est:

Error 1 'Sandbox.UnitOfWorkScope<Sandbox.MyObjectContext>': type used in a using statement must be implicitly convertible to 'System.IDisposable' 

I mis en œuvre IDisposable sur UnitOfWorkScope (et pour voir si cela était le problème, aussi MyObjectContext).

Qu'est-ce qui me manque?

Répondre

13

I mis en œuvre IDisposable sur UnitOfWorkScope

Non, vous n'avez pas. Vous avez spécifié que votre T doit implémenter IDisposable.

Utilisez cette syntaxe:

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

Alors d'abord, déclarer quelles classes/interfaces UnitOfWorkScope outils (IDisposable) et déclarent les contraintes de T (T doit provenir de ObjectContext, mettre en œuvre IDisposable et un constructeur parameterless)

+0

+1 - exactement. UnitOfWorkScope n'implémente pas IDisposable dans la source donnée. – TomTom

5

Vous avez indiqué que le T à UnitOfWorkScope<T> doit mettre en œuvre IDisposable, mais pas que UnitOfWorkScope<T>se implémente IDisposable. Je pense que vous voulez ceci:

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

Vous avez mis IDisposable sur tout sauf ce que vous devez mettre en œuvre sur: UnitOfWorkScope<T> met en oeuvre une méthode Dispose mais n'implémente IDisposable. La clause where s'applique à T, et non à la classe.

Questions connexes