コンパイラの警告 (レベル 1) C4462
型の GUID を特定できません。 プログラムは、実行時に失敗する可能性があります。
C4462 警告は、パブリックな TypedEventHandler
に、型パラメーターの 1 つとして外側のクラスへの参照が含まれる場合に、Windows ランタイム アプリケーションまたはコンポーネントで発生します。
この警告は、自動的にエラーになります。 この動作を変更する場合は、#pragma warning を使用します。 たとえば、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();
}
このエラーを回避する方法は 2 つあります。 1 つは、次の例に示すように、イベント内部のアクセシビリティを、同じ実行可能ファイル内のコードで使用できるように提供する方法です。このアクセシビリティは、他の Windows ランタイム コンポーネントのコードでは使用できないようにします。
internal:
event Windows::Foundation::TypedEventHandler<R ^, EventArgs^>^ e;
イベントがパブリックであることが求められる場合は、もう 1 つの方法で回避できます。この方法は既定のインターフェイスによって公開されます。
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;
};
Windows::Foundation::TypedEventHandler<R^, EventArgs^>^
型の GUID が使用されるのは、他のコンポーネントからその型にアクセスする場合だけです。 最初の方法は、問題回避の後、独自のコンポーネント内でのみアクセスできるため機能します。 それ以外の場合、コンパイラは最悪の場合を想定する必要があり、警告を出力します。