隐式转换为'System.IDisposable'错误

时间:2014-02-12 05:38:48

标签: c# kinect

这就是我想要做的事情

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'语句给出了一个错误,指出 - “'Microsoft.Kinect.KinectAudioSource':在using语句中使用的类型必须可以隐式转换为'System.IDisposable'”。如何消除此错误及其含义是什么?

10 个答案:

答案 0 :(得分:17)

我参加聚会很晚,但我应该说:

如果在使用语句中使用上下文时出现此错误,则必须添加reference to Entity Framework

答案 1 :(得分:14)

您可以这样创建:

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

    }

    public void GetData()
    {

    }
}

之后你可以创建像

这样的对象
using (HelloTest Ht = new HelloTest())
        {
            Ht.GetData();
        }

我希望以上示例有用

答案 2 :(得分:5)

创建新项目时遇到类似问题我忘了通过Nuget Package Manager安装ENTITY FRAMEWORK。很抱歉,如果这与kinect无关,但是当我在VS中寻找错误时谷歌就把我带走了。

答案 3 :(得分:4)

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

答案 4 :(得分:0)

KinectAudioSource应该实现IDisposable接口以便与using块一起使用。未实现Idisposable的类无法在using语句中实例化。

  

通常,当您使用IDisposable objAs规则时,使用时   IDisposable对象,您应该在using中声明并实例化它   声明。 using语句在对象上调用Dispose方法   以正确的方式,(当你使用它如前所示)它也   一旦Dispose出现,就会导致对象本身超出范围   调用。在using块中,该对象是只读的,不可以   修改或重新分配,MSDN

答案 5 :(得分: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())
        {
        }
    }
}

答案 6 :(得分:0)

同样从System.EnterpriseServices版本2添加.NET引用将解决该错误。如果您要转换旧版本并且多次出现“使用”关键字以替换

,则此功能尤其有用

答案 7 :(得分:0)

发生System.IDisposable错误是因为您尝试打开的连接可能不会自动关闭,超出打开连接的范围。

从using()子句中排除模型连接创建,以便它保持为:

var source = new CreateAudioSource(); / *    其余的代码在这里 * /

另外,请确保您不会省略对象创建的“new”关键字。

答案 8 :(得分:0)

在创建新的控制台应用程序时,我遇到了类似的问题。我忘记在项目中添加ENTITY FRAMEWORK参考。

添加有关ENTITY FRAMEWORK解决问题的参考。

答案 9 :(得分:-1)

您应该将System.Data.Linq添加到项目中的参考文献中。这解决了我的问题。