想象一下以下结构类型:
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 解决方案来重现这种情况。可以在这里下载。