Avviso del compilatore (livello 1) C4462
impossibile determinare il GUID del tipo. Il programma potrebbe bloccarsi in fase di esecuzione.
L'avviso C4462 viene generato in un componente o app di Windows Runtime quando un elemento TypedEventHandler
pubblico presenta come uno dei relativi parametri di tipo un riferimento alla classe contenitore.
Questo avviso viene alzato di livello automaticamente a un errore. Se si desidera modificare questo comportamento, usare #pragma avviso. Ad esempio, per impostare C4462 in un problema di avviso di livello 4, aggiungere questa riga al file di codice sorgente:
#pragma warning(4:4462)
Esempio
Questo esempio genera l'avviso 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();
}
Esistono due modi per risolvere l'errore. In primo luogo, come mostrato nell'esempio seguente, è possibile dare all'evento accessibilità interna in modo che risulti disponibile al codice nello stesso eseguibile, ma non al codice in altri componenti di Windows Runtime.
internal:
event Windows::Foundation::TypedEventHandler<R ^, EventArgs^>^ e;
Se l'evento deve essere pubblico, è possibile ricorrere a un'altra soluzione, ovvero esporlo attraverso un'interfaccia predefinita:
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^>^
viene utilizzato solo quando il tipo è accessibile da un altro componente. La prima soluzione funziona perché è accessibile solo dall'interno del proprio componente dopo l'applicazione della soluzione. In caso contrario, il compilatore suppone il caso peggiore e genera l'avviso.