隐式转换为“System.IDisposable”的错误

16

这就是我想要做的:

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个回答

20
我很晚才来参加这个派对,但还是要说一句话:
如果您在使用`using`语句中的上下文时出现此错误,请务必添加对`Entity Framework`的引用。

1
@点击右键选择项目,然后选择“NuGet软件包管理器”。搜索Entity Framework并安装它。 - Vishal
已经有了对EF的引用,我只是更新了我的EF,然后那个错误就消失了。谢谢你,但我不理解这个解决方案。 - musigh
@musigh,我已经从2017年开始转向Javascript和React.js,所以我对Entity Framework和.NET一无所知。抱歉! - Vishal

18

你可以这样创建:

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

    }

    public void GetData()
    {

    }
}

之后,您就能够像这样创建对象:

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

我希望上面的例子有所帮助


5

当我创建一个新项目时,遇到了类似的问题,原来是忘记通过Nuget包管理器安装ENTITY FRAMEWORK。抱歉如果这与Kinect无关,但这是我在寻找VS中的错误时被谷歌引导到的地方。


4

使用关键字需要实现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。只有在您想在 finally 中进行一些清理并且不关心异常时,才会使用 try-finally


0

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

感谢您的及时回复。错误已经消失,但现在我有一个新问题。我保存的录制音频(.wav/.mp3)文件无法在Windows Media Player中播放。它显示“Windows Media Player在播放此文件时遇到了问题”。 - CodeKinect
@CodeKinect 我不确定你是如何保存它的,因为在你的代码中没有包含。返回的流以16 kHz采样的16位PCM格式包含数据,因此如果你只是将其复制到文件中,它不一定会“原样”播放。 - Joachim Isaksson
你建议我该怎么做? - CodeKinect

0

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

通常情况下,当您使用一个 IDisposable 对象时,应该在 using 语句中声明并实例化它。using 语句会以正确的方式调用对象的 Dispose 方法,并且(当您像之前所示那样使用它时)也会导致对象本身在 Dispose 被调用后立即离开作用域。在 using 块内,对象是只读的,不能被修改或重新赋值,MSDN


0

同时添加来自 System.EnterpriseServices 版本 2 的 .NET 引用将解决该错误。如果您正在从旧版本进行转换并且有多个“using”关键字需要替换,则这尤其有用。


0

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

添加ENTITY FRAMEWORK引用解决了这个问题。


0

System.IDisposable错误是因为您尝试打开的连接可能不会在打开连接的范围之外自动关闭。

从using()子句中排除模型连接创建,使其仅保留为:

var source = new CreateAudioSource(); /* 其余代码 */

还要确保您不会省略对象创建的“new”关键字。


-1

你应该在项目的引用中添加 System.Data.Linq。这对我解决了问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接