2014-02-12 68 views
9

這就是我要做的隱式轉換爲「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()) 
     { 
     } 
    } 
} 

的「使用」的語句給一個錯誤,指出 - 「‘Microsoft.Kinect.KinectAudioSource’:在使用類型使用聲明必須隱式轉換爲'System.IDisposable'「。我如何消除這個錯誤,它是什麼意思?

+0

你解決了嗎? – themis

回答

0

KinectAudioSource應該執行,以便在IDisposable接口與使用塊使用。沒有實現Idisposable的類不能在using語句中實例化。

通常,當您使用了IDisposable objAs的規則,當您使用 IDisposable的對象,你應該申報,並在使用 聲明實例化。 using語句調用對象 的Dispose方法以正確的方式,和(當你使用它如前所示),這也導致 對象本身,儘快走出去的範圍爲處置是 調用。內的使用塊,所述對象是隻讀,不能 修改或重新分配,MSDN

0

KinectAudioSource不是IDisposable,所以它不能在using塊一起使用。你可能要做的是關閉數據流(which does implement 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

謝謝您的即時回覆。錯誤消失了,但現在我有一個新問題。我正在保存的錄製音頻文件(.wav/.mp3)沒有被Windows Media Player播放。它說 - 「Windows Media Player在播放此文件時遇到問題」。 – CodeKinect

+0

@CodeKinect我不知道你是如何保存它,因爲它沒有包含在你的代碼中。返回的數據流包含16位PCM格式的數據,採樣頻率爲16 kHz,所以如果您只是將其複製到文件中,則不一定會按照原樣播放。 –

+0

你建議我做什麼? – CodeKinect

4

Using關鍵字所需IDisposable接口實現。如果你得到錯誤'Microsoft.Kinect.KinectAudioSource':type used in a using statement must be implicitly convertible to 'System.IDisposable.

所以這意味着像約阿希姆說KinectAudioSource不是IDisposable

相反的using可以使用

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

using相當於try-finally。當你最終想要進行一些清理時,你只會使用try-finally,而不關心這個異常。

9

您可以創建這樣的:那麼你可以能創建對象像

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

我希望上面的例子中樂於助人後

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

    } 

    public void GetData() 
    { 

    } 
} 

0

還增加了從.NET的System.EnterpriseServices參考版本2將解決錯誤。如果從與舊版本的轉換,這是特別有用的,你有「使用」關鍵字的多次出現,以取代

-1

您應該添加System.Data.Linq在項目中的參考文獻。這解決了我的問題。

4

我創建一個新的項目,我已經忘記了通過NuGet包管理器安裝實體框架時,也有類似的問題。對不起,如果這不涉及kinect,但這是谷歌帶我時,我正在尋找VS中的錯誤。

12

我非常遲到了,但我應該說:

如果您在使用內部使用的語句的上下文得到這個錯誤,您必須添加一個reference to Entity Framework

+0

如何添加對實體框架的引用? – Hits

+0

@點擊右鍵點擊項目並選擇'nuget package manager'。搜索實體框架並安裝它。 – Vishal