【问题标题】:Reactive Extensions bug on Windows PhoneWindows Phone 上的响应式扩展错误
【发布时间】:2014-08-27 21:55:09
【问题描述】:

使用VS 2012 编译,项目类型WP 8.0 如果未附加调试器,以下代码将失败。

不知何故,如果未附加调试器,编译器优化会破坏 Crash() 中的代码 - 请参阅代码中的 cmets。

Lumia 1520 (8.1)Lumia 630 (8.0) 上测试。

任何想法为什么会发生这种情况?

public partial class MainPage : PhoneApplicationPage
{
    public MainPage()
    {
        InitializeComponent();
        Button.Tap += (sender, args) => new A<B, string>(new B(), "string").Crash();
    }
}
public class B
{
    public void Foo<T>(T val) { }
}
public class A<T1, T2> where T1 : B
{
    private T1 _t1;
    private T2 _t2;
    public A(T1 t1, T2 t2)
    {
        _t2 = t2;
        _t1 = t1;
    }
    public void Crash()
    {
        var obs = Observable.Return(_t2);
        obs.Subscribe(result =>
        {
            //CLR is expecting T2 to be System.String here,
            //but somehow, after passing through Observable
            //T2 here is not a string, it's A<T1, T2>

            new List<T2>().Add(result);
        });
        //Will run normally if commented
        _t1.Foo(new object());
    }
}

【问题讨论】:

  • 似乎是编译器错误,而不是 Rx 错误。您是否尝试过使用 ILSpy 或 .NET Reflector 来检查生成的 IL?
  • 我会尝试使用Observable.Return&lt;T2&gt;(_t2);,而不是让编译器来决定这里的类型。可能有一个错误。当然,这是一个很长的镜头。
  • 我在 Windows Phone 上遇到了很多 Rx 问题。对我来说,它会编译,然后在我实际尝试调用包含类时抛出MethodNotFoundException。对我来说,升级到 VS Update 2 的发行版是可行的。我仍然不知道实际出了什么问题,但请确保您使用的是所有内容的最新更新。显然我们的问题有些不同,但这可能有助于提供一些指导。
  • 问题是什么 - “有什么想法吗?” - 你只是想知道如何让它停止崩溃?
  • 可能是因为 _t1.Foo(这里也是);

标签: c# .net compiler-errors windows-phone system.reactive


【解决方案1】:
 _t1.Foo<type>(type);

您缺少类型声明。编译器在猜测(并且猜测错误)。严格输入所有内容,它应该会运行。

【讨论】:

  • 这不是线索,你可以自己实现 IObserver 和 IObservable 一切都会正常工作的。
  • 看起来调试器正在创建与编译器的连接,并且调试器也需要严格键入所有变量。调试器猜对了,编译器以某种方式从中获取问题。调试器为什么要修复问题并不重要,根本原因已经找到。
猜你喜欢
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-07
  • 1970-01-01
  • 2013-09-21
相关资源
最近更新 更多