2014-02-12 6 views
9

Das ist, was ichImplizit umwandelbar ‚System.IDisposable‘ Fehler

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()) 
     { 
     } 
    } 
} 

Die ‚mit‘ Anweisung gibt einen Fehler zu tun versuche, in dem es heißt - "‚Microsoft.Kinect.KinectAudioSource‘: Typ verwendet in Eine using-Anweisung muss implizit in 'System.IDisposable' konvertiert werden. " Wie beseitige ich diesen Fehler und was bedeutet das?

+0

hast du es repariert? – themis

Antwort

0

Die Klasse KinectAudioSource soll die Schnittstelle IDisposable implementieren, damit sie mit block verwendet werden kann. Die Klassen, die Idisposable nicht implementieren, konnten bei der Verwendung von Anweisung nicht instanziiert werden.

In der Regel, wenn Sie eine IDisposable verwenden, um eine Regel objAs, wenn Sie ein IDisposable-Objekt verwenden, sollten Sie deklarieren und instanziieren es in einer mit Aussage. Die using-Anweisung ruft die Dispose-Methode für das Objekt in der richtigen Weise auf, und (wenn Sie es wie zuvor gezeigt verwenden) bewirkt , dass das Objekt selbst außerhalb des Gültigkeitsbereichs liegt, sobald Dispose aufgerufen wird. Innerhalb des mit Block wird das Objekt nur gelesen und kann geändert oder neu zugewiesen nicht sein, MSDN

0

KinectAudioSource nicht IDisposable ist, so kann es nicht in einem using Block verwendet werden. Was Sie wahrscheinlich tun möchten, ist, den Datenstrom (which does implement IDisposable) zu schließen, wenn Sie mit der Aufnahme fertig sind.

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

Vielen Dank für die sofortige Antwort. Der Fehler ist verschwunden, aber jetzt habe ich ein neues Problem. Die aufgezeichnete Audiodatei (.wav/.mp3), die ich speichere, wird nicht von Windows Media Player wiedergegeben. Es heißt - "Windows Media Player hat beim Abspielen dieser Datei ein Problem festgestellt". – CodeKinect

+0

@CodeKinect Ich bin mir nicht sicher, wie Sie es speichern, da es nicht in Ihrem Code enthalten ist. Der zurückgegebene Stream enthält Daten im 16-Bit-PCM-Format, die mit 16 kHz abgetastet wurden. Wenn Sie sie also nur in eine Datei kopieren, wird sie nicht unbedingt "so wie sie ist" abgespielt. –

+0

Was schlägst du vor? – CodeKinect

4

Using Stichwort erforderlich IDisposable Interface-Implementierung. Wenn Sie Fehler bekommen 'Microsoft.Kinect.KinectAudioSource':type used in a using statement must be implicitly convertible to 'System.IDisposable.

So bedeutet es wie Joachim sagte KinectAudioSource ist nicht IDisposable.

Statt using können Sie verwenden

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

using entspricht try-finally. Sie werden nur try-finally verwenden, wenn Sie innerlich etwas aufräumen wollen und sich nicht um die Ausnahme kümmern.

9

Sie können so erstellen:

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

    } 

    public void GetData() 
    { 

    } 
} 

nach, dann können Sie in der Lage erstellen Objekt wie

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

ich oben Beispiel hilfreich hoffen

0

auch das Hinzufügen .NET Referenz von System.EnterpriseServices Version 2 wird den Fehler beheben. Dies ist besonders nützlich, wenn Sie von und ältere Version konvertieren und Sie haben mehrere Vorkommen von "mit" Schlüsselwort zu ersetzen

-1

Sie sollten System.Data.Linq zu Ihren Referenzen im Projekt hinzufügen. Das hat das Problem für mich gelöst.

4

Ich hatte ein ähnliches Problem beim Erstellen eines neuen Projekts, das ich vergessen hatte, ENTITY FRAMEWORK über Nuget Package Manager zu installieren.Es tut uns leid, wenn dies nicht mit kinect zu tun hat, aber das war der Punkt, an dem Google mich mitgenommen hat, als ich nach dem Fehler in VS gesucht habe.

12

Ich bin sehr spät zur Party, aber ich soll sagen:

Sie müssen ein reference to Entity Framework hinzufügen, wenn Sie diesen Fehler erhalten, während Kontext-Anweisung innerhalb Verwendung mit.

+0

Wie wird ein Verweis auf Entity Framework hinzugefügt? – Hits

+0

@ Klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie 'nuget package manager'. Suchen Sie nach Entity Framework und installieren Sie es. – Vishal