Windows Phone上的反应式扩展程序错误


114

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

以某种方式,如果未附加调试器,则编译器优化会破坏内部的代码Crash()-请参见代码中的注释。

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

6
似乎是编译器错误,而不是Rx错误。您是否尝试过使用ILSpy或.NET Reflector检查生成的IL?
布兰登

8
我会尝试使用Observable.Return<T2>(_t2);,而不是让编译器在这里确定类型。可能有一个错误。当然,这是一个远景。
cwharris 2014年

6
我在Windows Phone上使用Rx遇到了很多问题。对我来说,它将进行编译,然后MethodNotFoundException在我实际尝试调用包含类时抛出一个。对我来说,升级到VS Update 2的发行版是可行的。我仍然不知道实际出了什么问题,但是请确保您正在使用所有内容的最新更新。显然,我们的问题有所不同,但这可能有助于提供一些指导。
马修·豪根

5
问题是-“任何想法?” -您是否只想知道如何使其停止崩溃?
Tim Lovell-Smith

1
可能是因为_t1.Foo <此处缺少类型>(这里也是);
akbar ali 2015年

Answers:


1
 _t1.Foo<type>(type);

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


这不是一个线索,您可以自己实现IObserver和IObservable,并且一切都会正常进行。
Yuriy Naydenov

看起来调试器正在创建与编译器的连接,并且调试器也需要严格定义所有变量。调试器猜测正确,编译器以某种方式从中获取问题。调试器为什么要解决此问题并不重要,已经找到了根本原因。
Japes
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.