Неявно конвертируется в ошибку "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())
        {
        }
    }
}

Инструкция "using" выдает одну ошибку, которая гласит:

"Microsoft.Kinect.KinectAudioSource": тип, используемый в операторе using, должен быть неявно преобразован в "System.IDisposable"

Как устранить эту ошибку и что это значит?

Ответ 1

Я очень опаздываю на вечеринку, но я должен сказать:

Вы должны добавить reference to Entity Framework, если вы получите эту ошибку, используя контекст внутри инструкции using.

Ответ 2

Вы можете создать так:

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

    }

    public void GetData()
    {

    }
}

после этого вы можете создать объект, например

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

Я надеюсь, что выше пример полезный

Ответ 3

У меня была аналогичная проблема при создании нового проекта, который я забыл установить ENTITY FRAMEWORK через Nuget Package Manager. Извините, если это не относится к kinect, но это то, где google взял меня, когда искал ошибку в VS.

Ответ 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 только в том случае, если хотите сделать некоторую очистку внутри и не волноваться об исключении.

Ответ 5

Класс KinectAudioSource должен реализовывать интерфейс IDisposable для использования с использованием блока. Классы, которые не реализуют Idisposable, не могут быть созданы в использовании инструкции.

Как правило, когда вы используете правило IDisposable objAs, когда вы используете IDisposable, вы должны объявить и создать экземпляр в использовании выражение. Оператор using вызывает метод Dispose на объекте и (когда вы используете его, как показано ранее), он также сам объект выходит из области действия, как только Dispose называется. Внутри используемого блока объект доступен только для чтения и не может быть изменено или переназначено, MSDN

Ответ 6

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

Ответ 7

Также добавление ссылки .NET из System.EnterpriseServices версии 2 решит ошибку. Это особенно полезно, если вы конвертируете из более старой версии и имеете несколько вхождений ключевого слова "using" для замены

Ответ 8

Ошибка System.IDisposable возникает из-за того, что соединение, которое вы пытаетесь открыть, может не закрыться автоматически, если находится вне области, в которой было открыто соединение.

Исключите создание соединения модели из предложения using(), чтобы оно оставалось следующим:

var source = new CreateAudioSource(); /*  Остальной код здесь */

Также убедитесь, что вы не пропустите ключевое слово "new" для создания объекта.

Ответ 9

У меня была похожая проблема при создании нового консольного приложения. Я забыл добавить ссылку ENTITY FRAMEWORK в свой проект.

Добавление ссылки на ENTITY FRAMEWORK решит проблему.

Ответ 10

Вы должны добавить System.Data.Linq к своим ссылкам в проекте. Это решило проблему для меня.