Ответ 1
Я очень опаздываю на вечеринку, но я должен сказать:
Вы должны добавить reference to Entity Framework
, если вы получите эту ошибку, используя контекст внутри инструкции using.
Вот что я пытаюсь сделать:
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"
Как устранить эту ошибку и что это значит?
Я очень опаздываю на вечеринку, но я должен сказать:
Вы должны добавить reference to Entity Framework
, если вы получите эту ошибку, используя контекст внутри инструкции using.
Вы можете создать так:
public class HelloTest : IDisposable
{
void IDisposable.Dispose()
{
}
public void GetData()
{
}
}
после этого вы можете создать объект, например
using (HelloTest Ht = new HelloTest())
{
Ht.GetData();
}
Я надеюсь, что выше пример полезный
У меня была аналогичная проблема при создании нового проекта, который я забыл установить ENTITY FRAMEWORK через Nuget Package Manager. Извините, если это не относится к kinect, но это то, где google взял меня, когда искал ошибку в VS.
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
только в том случае, если хотите сделать некоторую очистку внутри и не волноваться об исключении.
Класс KinectAudioSource
должен реализовывать интерфейс IDisposable
для использования с использованием блока. Классы, которые не реализуют Idisposable, не могут быть созданы в использовании инструкции.
Как правило, когда вы используете правило IDisposable objAs, когда вы используете IDisposable, вы должны объявить и создать экземпляр в использовании выражение. Оператор using вызывает метод Dispose на объекте и (когда вы используете его, как показано ранее), он также сам объект выходит из области действия, как только Dispose называется. Внутри используемого блока объект доступен только для чтения и не может быть изменено или переназначено, MSDN
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())
{
}
}
}
Также добавление ссылки .NET из System.EnterpriseServices версии 2 решит ошибку. Это особенно полезно, если вы конвертируете из более старой версии и имеете несколько вхождений ключевого слова "using" для замены
Ошибка System.IDisposable возникает из-за того, что соединение, которое вы пытаетесь открыть, может не закрыться автоматически, если находится вне области, в которой было открыто соединение.
Исключите создание соединения модели из предложения using(), чтобы оно оставалось следующим:
var source = new CreateAudioSource(); /* Остальной код здесь */
Также убедитесь, что вы не пропустите ключевое слово "new" для создания объекта.
У меня была похожая проблема при создании нового консольного приложения. Я забыл добавить ссылку ENTITY FRAMEWORK в свой проект.
Добавление ссылки на ENTITY FRAMEWORK решит проблему.
Вы должны добавить System.Data.Linq
к своим ссылкам в проекте. Это решило проблему для меня.