Поделиться через


Предупреждение компилятора (уровень 1) C4462

невозможно определить GUID типа. Программа может завершиться ошибкой во время выполнения.

Предупреждение C4462 возникает в приложении или компоненте среды выполнения Windows, когда открытый TypedEventHandler содержит в качестве одного из своих параметров типа ссылку на включающий класс.

Это предупреждение автоматически повышается до ошибки. Если вы хотите изменить это поведение, используйте предупреждение #pragma. Например, чтобы сделать C4462 проблемой с предупреждением уровня 4, добавьте эту строку в файл исходного кода:

#pragma warning(4:4462)

Пример

В этом примере создается предупреждение 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();
}

Существует два способа устранения этой ошибки. Одним из способов, который показан в следующем примере, является предоставление событию внутренней доступности, чтобы оно было доступно коду в этом же исполняемом файле, но не в коде других компонентов среды выполнения Windows.

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

Если событие должно быть открытым, можно использовать другое решение, заключающееся в предоставлении доступа через интерфейс по умолчанию:

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

Идентификатор GUID типа Windows::Foundation::TypedEventHandler<R^, EventArgs^>^ используется только при обращении к этому типу из другого компонента. Первый способ работает, поскольку после исправления доступ возможен только из собственного компонента. В противном случае компилятор должен предположить наихудший случай и выдать предупреждение.