Share via


Advertencia del compilador (nivel 1) C4462

no puede determinar el GUID del tipo. El programa puede dar un error en tiempo de ejecución.

La advertencia C4462 se produce en una aplicación o componente de Windows en tiempo de ejecución cuando uno de los parámetros de tipos de un controlador TypedEventHandler público es una referencia a la clase envolvente.

Esta advertencia suele convertirse automáticamente en un error. Si quiere modificar este comportamiento, use #pragma warning. Por ejemplo, para convertir la advertencia C4462 en un problema de advertencia de nivel 4, agregue esta línea al archivo de código fuente:

#pragma warning(4:4462)

Ejemplo

Este ejemplo genera la advertencia 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();
}

Hay dos maneras de evitar el error. Una de ellas, la que se muestra en el ejemplo siguiente, es proporcionar al evento accesibilidad interna, de modo que esté disponible para el código que se encuentra en el mismo ejecutable pero no para el código de otros componentes de Windows en tiempo de ejecución.

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

Si el evento tiene que ser público, puede utilizar la otra solución, que consiste en exponerlo a través de una interfaz predeterminada:

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 del tipo Windows::Foundation::TypedEventHandler<R^, EventArgs^>^ solo se utiliza cuando se accede al tipo desde otro componente. La primera solución funciona porque, tras implementarla, solo puede acceder dentro de su propio componente. De lo contrario, el compilador tendría que presuponer el peor de los casos y emitir la advertencia.