Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows Phone上的被动扩展错误_C#_.net_Compiler Errors_Windows Phone_System.reactive - Fatal编程技术网

C# Windows Phone上的被动扩展错误

C# Windows Phone上的被动扩展错误,c#,.net,compiler-errors,windows-phone,system.reactive,C#,.net,Compiler Errors,Windows Phone,System.reactive,使用VS 2012编译,项目类型为WP 8.0如果未附加调试器,以下代码将失败 不知何故,如果没有附加调试器,编译器优化会破坏Crash()-请参阅代码中的注释 在Lumia 1520(8.1)和Lumia 630(8.0)上测试 你知道为什么会这样吗 public partial class MainPage : PhoneApplicationPage { public MainPage() { InitializeComponent(); B

使用
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());
    }
}
public部分类主页:PhoneApplicationPage
{
公共主页()
{
初始化组件();
点击+=(发送方,参数)=>新A(新B(),“字符串”).Crash();
}
}
公共B级
{
公共无效Foo(T val){}
}
公共A类,其中T1:B
{
私人T1_T1;
私人T2_T2;
公共A(T1、T2、T2)
{
_t2=t2;
_t1=t1;
}
公共空间崩溃()
{
var obs=可观察的回报率(_t2);
obs.Subscribe(结果=>
{
//CLR希望T2在这里是System.String,
//但不知何故,在通过可观察的
//T2这里不是一个字符串,它是一个
新建列表()。添加(结果);
});
//如果有评论,将正常运行
_t1.Foo(新对象());
}
}
\u t1.Foo(类型);

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

似乎是编译器错误,而不是Rx错误。您是否尝试过使用ILSpy或.NET Reflector检查生成的IL?我会尝试使用
Observable.Return(_t2),而不是让编译器在此处决定类型。这可能有问题。当然,这是不可能的。我在Windows Phone上的Rx有很多问题。对我来说,它将进行编译,然后在我实际尝试调用包含类时抛出一个
MethodNotFoundException
。对我来说,升级到VS Update 2的发行版是可行的。我仍然不知道到底出了什么问题,但请确保您使用的是所有内容的最新更新。显然,我们的问题有点不同,但这可能有助于提供一些指导。问题是什么——“有什么想法吗?”——你只是想知道如何让它停止崩溃吗?可能是因为_t1.Foo(这里也是);这不是一个线索,你可以自己实现IObserver和IObservable,一切都会正常工作。看起来调试器正在创建与编译器的连接,调试器也需要严格键入所有变量。调试器的猜测是正确的,而编译器不知何故从中获得了疑问。调试器修复问题的原因并不重要,根本原因已经找到。
 _t1.Foo<type>(type);