C#如何在同一类型上有多个约束

时间:2014-07-30 07:08:16

标签: c# generics idisposable

我发现了一种使用IDisposable的模式,并希望编写以下代码来生成它:

public static void SetTo<T>(this T value, ref T pos) where T : IDisposable
{
    using (var _ = Interlocked.Exchange(ref pos, value))
    {
    }
}

然而,这并没有编译,也不能

public static void SetTo<T>(this T value, ref T pos) where T : IDisposable where T : class
{
    using (var _ = Interlocked.Exchange(ref pos, value))
    {
    }
}

实际上我只在T是一个类(非值类型)时使用它,但IDisposable也支持值类型,所以类约束是不够的。

如何指定IDisposableclass约束?

更新

感谢您的回答。我还更新了标题。有人建议我检查posvalue是不是一样的。这样的检查可以完成如下:

public static void SetTo<T>(this T value, ref T pos) where T : class,  IDisposable
{
    for (;;)
    {
        var old = pos;
        if (ReferenceEquals(value, old))
            return;
        if (Interlocked.CompareExchange(ref pos, value, old) != old) 
            continue;
        using (old)
           return;
    }
}

1 个答案:

答案 0 :(得分:2)

您可以指定多个约束,后跟,。就像下面的

public static void SetTo<T>(T value, ref T pos) where T : class, IDisposable

由于某些原因,编译器阻止您IDisposable, class抱怨class约束应该先于所有其他约束,因此您需要where T : class, IDisposable。订购事宜..