Partilhar via


Aviso do compilador (nível 1) C4462

Não é possível determinar o GUID do tipo. O programa poderá falhar no runtime.

O aviso C4462 ocorre em um aplicativo ou um componente do Windows Runtime quando um TypedEventHandler público tem como um de seus parâmetros de tipo uma referência para a classe do delimitador.

Esse aviso é promovido automaticamente a um erro. Se você quiser modificar esse comportamento, use aviso #pragma. Por exemplo, para tornar o C4462 em um problema de aviso de nível 4, adicione essa linha ao arquivo de código-fonte:

#pragma warning(4:4462)

Exemplo

Esta amostra gera o aviso 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();
}

Existem duas maneiras de resolver o erro. Uma maneira, mostrada no exemplo a seguir, é dar ao evento a acessibilidade interna para que ele esteja disponível para codificar no mesmo executável, mas não para codificar em outros componentes do Windows Runtime.

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

Se o evento deve ser público, você pode usar outra solução alternativa, que é expor o evento por meio de uma interface padrão:

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;
};

O GUID do tipo Windows::Foundation::TypedEventHandler<R^, EventArgs^>^ só é usado quando o tipo é acessado de outro componente. A primeira solução alternativa funciona porque só pode ser acessada em seu próprio componente após a solução. Caso contrário, o compilador precisa presumir o pior caso e emitir o aviso.