我发现了一种使用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
也支持值类型,所以类约束是不够的。
如何指定IDisposable
和class
约束?
更新
感谢您的回答。我还更新了标题。有人建议我检查pos
和value
是不是一样的。这样的检查可以完成如下:
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;
}
}
答案 0 :(得分:2)
您可以指定多个约束,后跟,
。就像下面的
public static void SetTo<T>(T value, ref T pos) where T : class, IDisposable
由于某些原因,编译器阻止您IDisposable, class
抱怨class
约束应该先于所有其他约束,因此您需要where T : class, IDisposable
。订购事宜..