与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?
—
布兰登
我会尝试使用
—
cwharris 2014年
Observable.Return<T2>(_t2);
,而不是让编译器在这里确定类型。可能有一个错误。当然,这是一个远景。
我在Windows Phone上使用Rx遇到了很多问题。对我来说,它将进行编译,然后
—
马修·豪根
MethodNotFoundException
在我实际尝试调用包含类时抛出一个。对我来说,升级到VS Update 2的发行版是可行的。我仍然不知道实际出了什么问题,但是请确保您正在使用所有内容的最新更新。显然,我们的问题有所不同,但这可能有助于提供一些指导。
问题是-“任何想法?” -您是否只想知道如何使其停止崩溃?
—
Tim Lovell-Smith
可能是因为_t1.Foo <此处缺少类型>(这里也是);
—
akbar ali 2015年