web-dev-qa-db-fra.com

Convertible implicitement en erreur 'System.IDisposable'

C'est ce que j'essaie de faire

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

L'instruction 'using' donne une erreur qui indique: "'Microsoft.Kinect.KinectAudioSource': le type utilisé dans une instruction using doit être implicitement convertible en 'System.IDisposable'". Comment puis-je éliminer cette erreur et qu'est-ce que cela signifie?

11
CodeKinect

Je suis très en retard à la fête, mais je devrais dire:

Vous devez ajouter un reference to Entity Framework si vous obtenez cette erreur lors de l'utilisation du contexte à l'intérieur de statement.

16
Vishal

Vous pouvez créer comme ça: 

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

    }

    public void GetData()
    {

    }
}

ensuite, vous pourrez créer un objet comme 

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

J'espère que ci-dessus l'exemple utile

13
VishalDream

J'ai eu un problème similaire lors de la création d'un nouveau projet, j'avais oublié d'installer ENTITY FRAMEWORK via Nuget Package Manager. Désolé si cela ne concerne pas kinect mais c’est là que Google m’a emmené alors que je cherchais l’erreur dans VS.

4
Travis Peterson

Using mot-clé requis IDisposable implémentation de l'interface. Si vous obtenez une erreur 'Microsoft.Kinect.KinectAudioSource':type used in a using statement must be implicitly convertible to 'System.IDisposable. 

Cela signifie donc que, comme Joachim l’a dit, KinectAudioSource n’est pas IDisposable.

Au lieu de using, vous pouvez utiliser 

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

using est équivalent try-finally. Vous n'utiliserez que try-finally lorsque vous souhaitez effectuer un nettoyage final à l'intérieur sans vous soucier de l'exception.

3
Mukesh Rawat

J'ai eu un problème similaire lors de la création d'une nouvelle application console. J'avais oublié d'ajouter une référence ENTITY FRAMEWORK dans mon projet. 

Ajout d'une référence sur le problème de résolution ENTITY FRAMEWORK.

0
ravi saini

La classe KinectAudioSource est supposée implémenter l'interface IDisposable pour pouvoir utiliser un bloc. Les classes qui n'implémentent pas Idisposable n'ont pas pu être instanciées à l'aide de statement.

En règle générale, lorsque vous utilisez un objet identifiable comme règle, lorsque vous utilisez un fichier Objet IDisposable, vous devez le déclarer et l’instancier dans un using déclaration. L'instruction using appelle la méthode Dispose sur l'objet correctement, et (lorsque vous l’utilisez comme indiqué précédemment), il ajoute également provoque la sortie de l'objet lui-même dès que Dispose est appelé. Dans le bloc using, l'objet est en lecture seule et ne peut pas être modifié ou réaffecté, MSDN

0
Adil

Ajouter également une référence .NET à partir de System.EnterpriseServices version 2 résoudra l’erreur. Ceci est particulièrement utile si vous convertissez depuis une version antérieure et que vous avez plusieurs occurrences du mot clé "using" à remplacer.

0
Tonny Ochido

KinectAudioSource n'est pas IDisposable, il ne peut donc pas être utilisé dans un bloc using. Ce que vous voulez probablement faire est de fermer le flux de données ( qui implémente IDisposable ) à la place lorsque vous avez terminé l’enregistrement, quelque chose comme:

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
Joachim Isaksson

L'erreur System.IDisposable se produit car la connexion que vous tentez d'ouvrir risque de ne pas se fermer automatiquement lorsque la connexion a été ouverte.

Excluez la création de votre connexion de modèle de la clause using (), afin qu’elle reste comme suit:

var source = new CreateAudioSource (); /* Reste du code ici * /

Veillez également à ne pas omettre le mot-clé "nouveau" pour la création d'objet.

0
Tonderai Muchada