これは私がやろうとしていることです:
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」に暗黙的に変換可能でなければなりません
このエラーを排除するにはどうすればよいですか?
私はパーティーに非常に遅れていますが、私は言うべきです:
Usingステートメント内でコンテキストを使用しているときにこのエラーが発生した場合は、reference to Entity Framework
を追加する必要があります。
次のように作成できます:
public class HelloTest : IDisposable
{
void IDisposable.Dispose()
{
}
public void GetData()
{
}
}
その後、次のようなオブジェクトを作成できます
using (HelloTest Ht = new HelloTest())
{
Ht.GetData();
}
上記の例を参考にしてください
Nuget Package Managerを介してENTITY FRAMEWORKをインストールするのを忘れていた新しいプロジェクトを作成するときに、同様の問題が発生しました。これがkinectに関連していない場合は申し訳ありませんが、VSでエラーを探していたときにGoogleが私を連れて行ってくれました。
Using
キーワードが必要IDisposable
インターフェイスの実装。エラー'Microsoft.Kinect.KinectAudioSource':type used in a using statement must be implicitly convertible to 'System.IDisposable.
が表示される場合
つまり、JoachimがKinectAudioSource
はIDisposable
ではないと言ったようです。
using
の代わりに使用できます
try
{
Execute();
}
finally
{
CleanupPart();
}
using
はtry-finally
と同等です。最終的にtry-finally
を使用するのは、最終的に内部のクリーンアップを行い、例外を気にしない場合のみです。
新しいコンソールアプリケーションを作成するときに同様の問題が発生しました。プロジェクトにENTITY FRAMEWORK参照を追加するのを忘れていました。
ENTITY FRAMEWORKに参照を追加すると、問題が解決します。
クラスKinectAudioSource
は、usingブロックで使用するためにIDisposable
インターフェイスを実装することになっています。 Idisposableを実装していないクラスは、usingステートメントでインスタンス化できませんでした。
原則として、IDisposable objAsをルールとして使用するとき、IDisposableオブジェクトを使用するときは、usingステートメントで宣言してインスタンス化する必要があります。 usingステートメントは、オブジェクトのDisposeメソッドを正しい方法で呼び出します。また、(前に示したように使用する場合)、Disposeが呼び出されるとすぐにオブジェクト自体もスコープ外になります。 usingブロック内では、オブジェクトは読み取り専用であり、変更または再割り当てすることはできません [〜#〜] msdn [〜#〜]
また、System.EnterpriseServicesバージョン2から.NET参照を追加すると、エラーが解決します。これは、以前のバージョンから変換していて、置換する「using」キーワードが複数ある場合に特に便利です。
KinectAudioSource
はIDisposable
ではないため、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())
{
}
}
}
System.IDisposableエラーが発生するのは、接続を開いた場所の範囲外にあるときに、開こうとしている接続が自動的に閉じない場合があるためです。
Using()句からモデル接続の作成を除外し、次のようにします:
var source = new CreateAudioSource();/*ここに残りのコード* /
また、オブジェクト作成の「新しい」キーワードを省略しないようにしてください。