次の構造体型を想像してください。
public struct Token : IDictionary<string, Token>
{
public readonly object Value;
public Token(string str) { Value = str; }
public Token(IDictionary<string, Token> dict) { Value = dict; }
/* IDictionary<string, Token> implementation is here */
}
それが何をするかについて私に何も尋ねないでください。実装は問題ではありません。すべてのメソッド/プロパティで NotImplementedException をスローできます。別のポータブル クラス ライブラリに配置されます。
次に、この構造体の使用法を想像してください。
var token = new Token("111");
var kvp = new KeyValuePair<string, Token>("aaa", token);
var val = kvp.Value.Value;
var t = val.GetType(); // XXX
このコードは、ほぼどこでも完全に機能します。
- デスクトップアプリ/Windowsサービスで(「メトロ」アプリは試していません)
- 任意のモードの WinPhone 8.1 エミュレーター (リリース、デバッグ、デバッガーの有無にかかわらず)
- デバッグモードの実際のWinPhone 8.1デバイス(Lumia 625で試用)
しかし、このコードを実際の WP 8.1 デバイス (Lumia 625、最新の更新) で RELEASE モードで実行すると、ExecutionEngineException
行で例外が発生XXX
しますAn unhandled exception of type 'System.ExecutionEngineException' occurred in Unknown Module.
。この例外はキャッチできず、詳細が含まれていません - アプリはただクラッシュします。
これはバグですか?または、WinPhone の既知の制限はありますか? なぜエミュレータで動作するのですか?そして、この奇妙な「条件」はすべて重要です。
Token
である必要がありますstruct
。class
IDictionary<K,V>
他のインターフェイスではなく、を実装する必要があります ( 、 を試しましIList<Token>
たICollection
)- 別のポータブル クラス ライブラリに配置する必要があります。WP 8.1プロジェクトで移動すると、正常に動作します
- のインスタンスは
Token
内に配置する必要がありますKeyValuePair<K,V>
。あなただけの場合token.Value.GetType()
- それはうまくいきます
この状況を再現するために、VS 2013 ソリューションを作成しました。ここからダウンロードできます。