Предупреждение компилятора (уровень 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^>^
используется только при обращении к этому типу из другого компонента. Первый способ работает, поскольку после исправления доступ возможен только из собственного компонента. В противном случае компилятор должен предположить наихудший случай и выдать предупреждение.