web-dev-qa-db-ja.com

「System.IDisposable」エラーに暗黙的に変換可能

これは私がやろうとしていることです:

private KinectAudioSource CreateAudioSource()
{
    var source = KinectSensor.KinectSensors[0].AudioSource;
    source.NoiseSuppression = _isNoiseSuppressionOn;
    source.AutomaticGainControlEnabled = _isAutomaticGainOn;
    return source;
}
private object lockObj = new object();
private void RecordKinectAudio()
{
    lock (lockObj)
    {
        using (var source = CreateAudioSource())
        {
        }
    }
}

「using」ステートメントは、1つのエラーを示します。

「Microsoft.Kinect.KinectAudioSource」:usingステートメントで使用されるタイプは、「System.IDisposable」に暗黙的に変換可能でなければなりません

このエラーを排除するにはどうすればよいですか?

12
CodeKinect

私はパーティーに非常に遅れていますが、私は言うべきです:

Usingステートメント内でコンテキストを使用しているときにこのエラーが発生した場合は、reference to Entity Frameworkを追加する必要があります。

18
Vishal

次のように作成できます:

public class HelloTest : IDisposable
{
    void IDisposable.Dispose()
    {

    }

    public void GetData()
    {

    }
}

その後、次のようなオブジェクトを作成できます

using (HelloTest Ht = new HelloTest())
        {
            Ht.GetData();
        }

上記の例を参考にしてください

14
VishalDream

Nuget Package Managerを介してENTITY FRAMEWORKをインストールするのを忘れていた新しいプロジェクトを作成するときに、同様の問題が発生しました。これがkinectに関連していない場合は申し訳ありませんが、VSでエラーを探していたときにGoogleが私を連れて行ってくれました。

5
Travis Peterson

Usingキーワードが必要IDisposableインターフェイスの実装。エラー'Microsoft.Kinect.KinectAudioSource':type used in a using statement must be implicitly convertible to 'System.IDisposable.が表示される場合

つまり、JoachimがKinectAudioSourceIDisposableではないと言ったようです。

usingの代わりに使用できます

try
{
    Execute();
}
finally
{
    CleanupPart();
}

usingtry-finallyと同等です。最終的にtry-finallyを使用するのは、最終的に内部のクリーンアップを行い、例外を気にしない場合のみです。

4
Mukesh Rawat

新しいコンソールアプリケーションを作成するときに同様の問題が発生しました。プロジェクトにENTITY FRAMEWORK参照を追加するのを忘れていました。

ENTITY FRAMEWORKに参照を追加すると、問題が解決します。

0
ravi saini

クラスKinectAudioSourceは、usingブロックで使用するためにIDisposableインターフェイスを実装することになっています。 Idisposableを実装していないクラスは、usingステートメントでインスタンス化できませんでした。

原則として、IDisposable objAsをルールとして使用するとき、IDisposableオブジェクトを使用するときは、usingステートメントで宣言してインスタンス化する必要があります。 usingステートメントは、オブジェクトのDisposeメソッドを正しい方法で呼び出します。また、(前に示したように使用する場合)、Disposeが呼び出されるとすぐにオブジェクト自体もスコープ外になります。 usingブロック内では、オブジェクトは読み取り専用であり、変更または再割り当てすることはできません [〜#〜] msdn [〜#〜]

0
Adil

また、System.EnterpriseServicesバージョン2から.NET参照を追加すると、エラーが解決します。これは、以前のバージョンから変換していて、置換する「using」キーワードが複数ある場合に特に便利です。

0
Tonny Ochido

KinectAudioSourceIDisposableではないため、usingブロックでは使用できません。おそらくあなたがすることは、記録が終わったときにデータストリームを閉じることです( これはIDisposableを実装します )。

private Stream CreateAudioStream()
{
    var source = KinectSensor.KinectSensors[0].AudioSource;
    source.NoiseSuppression = _isNoiseSuppressionOn;
    source.AutomaticGainControlEnabled = _isAutomaticGainOn;
    return source.Start();
}
private object lockObj = new object();
private void RecordKinectAudio()
{
    lock (lockObj)
    {
        using (var source = CreateAudioStream())
        {
        }
    }
}
0

System.IDisposableエラーが発生するのは、接続を開いた場所の範囲外にあるときに、開こうとしている接続が自動的に閉じない場合があるためです。

Using()句からモデル接続の作成を除外し、次のようにします:

var source = new CreateAudioSource();/*ここに残りのコード* /

また、オブジェクト作成の「新しい」キーワードを省略しないようにしてください。

0
tonderaimuchada