Skip to content

Latest commit

 

History

History
63 lines (49 loc) · 2.12 KB

compiler-warning-level-1-c4462.md

File metadata and controls

63 lines (49 loc) · 2.12 KB
description title ms.date f1_keywords helpviewer_keywords ms.assetid
Learn more about: Compiler Warning (level 1) C4462
Compiler Warning (level 1) C4462
10/25/2017
C4462
C4462
4e20aca4-293e-4c75-a83d-961c27ab7840

Compiler Warning (level 1) C4462

cannot determine the GUID of the type. Program may fail at runtime.

Warning C4462 occurs in a Windows Runtime app or component when a public TypedEventHandler has as one of its type parameters a reference to the enclosing class.

This warning is automatically promoted to an error. If you wish to modify this behavior, use #pragma warning. For example, to make C4462 into a level 4 warning issue, add this line to your source code file:

#pragma warning(4:4462)

Example

This sample generates warning 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();
}

There are two ways to work around the error. One way, shown in the next example, is to give the event internal accessibility so that it is available to code in the same executable but not to code in other Windows Runtime components.

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

If the event must be public, then you can use the other workaround, which is to expose it through a default interface:

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

A GUID of the type Windows::Foundation::TypedEventHandler<R^, EventArgs^>^ is only used when the type is accessed from another component. The first workaround works because it can only be accessed within its own component after the workaround. Otherwise, the compiler has to assume the worst case and emit the warning.