コンパイラの警告 (レベル 2) CS0728

更新 : 2007 年 11 月

エラー メッセージ

using または lock ステートメントの引数であるローカルの '変数' への割り当てが間違っている可能性があります。Dispose の呼び出しまたはロック解除がローカルの元の値で実行されます。

using ブロックまたは lock ブロックで一時的なリソース リークが発生する場合があります。次に例を示します。

thisType f = null;

using (f)

{

f = new thisType();

...

}

この場合、thisType 変数の元の値 (null など) は、using ブロックの実行が終了した時点で破棄されます。しかし、このブロック内で生成された thisType オブジェクトについては、最終的にガベージ コレクションが実行されるまで破棄されません。

このエラーを解決するには、次のようにします。

using (thisType f = new thisType())

{

...

}

これで、新たに割り当てられた thisType オブジェクトが破棄されるようになります。

使用例

次のコードでは、CS0728 警告が生成されます。

// CS0728.cs

using System;
public class ValidBase : IDisposable
{
    public void Dispose() {  }
}

public class Logger
{
    public static void dummy()
    {
        ValidBase vb = null;
        using (vb) 
        {
            vb = null;  // CS0728
        }
        vb = null;
    }
    public static void Main() { }
}