Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can't Use Generic C# Class in Using Statement

I'm trying to use a generic class in a using statement but the compiler can't seem to treat it as implementing 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>())
            {
            }
        }
    }
}

Compiler error is:

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

I implemented IDisposable on UnitOfWorkScope (and to see if that was the problem, also on MyObjectContext).

What am I missing?

like image 989
Eric J. Avatar asked Dec 30 '25 07:12

Eric J.


1 Answers

I implemented IDisposable on UnitOfWorkScope

No, you didn't. You specified that your T should implement IDisposable.

Use this syntax:

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

So first, declare what classes/interfaces UnitOfWorkScope implements (IDisposable) and then declare the constraints of T (T must derive from ObjectContext, implement IDisposable and have a parameterless constructor)

like image 191
Michael Stum Avatar answered Jan 01 '26 22:01

Michael Stum



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!