Udostępnij za pomocą


Ostrzeżenie kompilatora (poziom 1) C4462

nie można określić GUID typu. Program może ulec awarii w czasie wykonywania.

Ostrzeżenie C4462 występuje w aplikacji lub składniku środowisko wykonawcze systemu Windows, gdy publiczny TypedEventHandler ma jako jeden z jego parametrów typu odwołanie do otaczającej klasy.

To ostrzeżenie jest automatycznie promowane do błędu. Jeśli chcesz zmodyfikować to zachowanie, użyj ostrzeżenia #pragma. Aby na przykład wprowadzić C4462 w problem z ostrzeżeniem poziomu 4, dodaj ten wiersz do pliku kodu źródłowego:

#pragma warning(4:4462)

Przykład

Ten przykład generuje ostrzeżenie 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();
}

Istnieją dwa sposoby obejścia tego błędu. Jednym ze sposobów, pokazanym w następnym przykładzie, jest zapewnienie zdarzeniu wewnętrznej dostępności, tak aby było ono dostępne dla kodu w tym samym pliku wykonywalnym, ale nie dla kodu w innych składnikach systemu Windows czasu wykonywania.

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

Jeśli zdarzenie musi być publiczne, można użyć innego obejścia, które polega na uwidocznieniu go przez interfejs domyślny:

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

Identyfikator GUID typu Windows::Foundation::TypedEventHandler<R^, EventArgs^>^ jest używany tylko wtedy, gdy dostęp do typu jest uzyskiwany z innego składnika. Pierwsza metoda obejścia problemu jest skuteczna, ponieważ może on być dostępny wyłącznie w ramach własnego składnika po zastosowaniu obejścia. W przeciwnym razie kompilator musi założyć najgorszy przypadek i wygenerować ostrzeżenie.