でコンパイルされ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を調べましたか?
—
ブランドン
Observable.Return<T2>(_t2);
ここでタイプを決定するためにコンパイラーに任せるのではなく、を使用してみます。バグがあるかもしれません。確かに、それはロングショットです。
Windows PhoneのRxで多くの問題が発生しました。私にとっては、コンパイルしてから、
—
マシューハウゲン14
MethodNotFoundException
実際に包含クラスを呼び出そうとしたときにをスローします。私にとって、VS Update 2のリリースバージョンへのアップグレードはうまくいきました。実際に何が問題だったかはまだわかりませんが、すべての最新アップデートを使用していることを確認してください。明らかに私たちの問題は少し異なりますが、それはいくつかのガイダンスを貸すのに役立つかもしれません。
質問は何ですか-「アイデア」?-クラッシュを停止する方法を知りたいだけですか?
—
Tim Lovell-Smith、
_t1.Foo <ここに型がありません>(そしてここにも));
—
akbar ali 2015