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