Partager via


Avertissement du compilateur (niveau 1) C4462

impossible de déterminer le GUID du type. Le programme risque d'échouer au moment de l'exécution.

L’avertissement C4462 se produit dans une application ou un composant Windows Runtime lorsqu’un TypedEventHandler public a parmi l’un de ses paramètres de type une référence à une classe englobante.

Cet avertissement est automatiquement promu en erreur. Si vous souhaitez modifier ce comportement, utilisez #pragma’avertissement. Par exemple, pour rendre C4462 en un problème d’avertissement de niveau 4, ajoutez cette ligne à votre fichier de code source :

#pragma warning(4:4462)

Exemple

Cet exemple génère l’avertissement C4462 :

namespace N
{
    public ref struct EventArgs sealed {};
    public ref struct R sealed
    {
        R() {}
        event Windows::Foundation::TypedEventHandler<R ^, EventArgs^>^ e;
    };
}

[Platform::MTAThread]
int main()
{
    auto x = ref new N::R();
}

Il existe deux solutions pour contourner l'erreur. La première solution, comme le montre l'exemple suivant, consiste à donner à l'événement une accessibilité interne afin qu'il soit accessible au code du même exécutable mais pas au code des autres composants Windows Runtime.

internal:
    event Windows::Foundation::TypedEventHandler<R ^, EventArgs^>^ e;

Si l'événement doit être public, vous pouvez utiliser l'autre solution, qui consiste à l'exposer via une interface par défaut :

ref struct R;
public interface struct IR{ event Windows::Foundation::TypedEventHandler<R ^, EventArgs^>^ e;};

public ref struct R sealed : [Windows::Foundation::Metadata::Default] IR
{
    R() {}
    virtual event Windows::Foundation::TypedEventHandler<R ^, EventArgs^>^ e;
};

Un GUID de type Windows::Foundation::TypedEventHandler<R^, EventArgs^>^ est utilisé uniquement lorsque le type est accessible à partir d'un autre composant. La première solution fonctionne, car l'événement n'est accessible que dans son propre composant (une fois la solution appliquée). Sinon, le compilateur doit partir du cas le plus défavorable et émettre l'avertissement.