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 버그가 아닌 컴파일러 버그처럼 보입니다. 생성 된 IL을 검사하기 위해 ILSpy 또는 .NET Reflector를 사용해 보셨습니까?
Brandon

8
Observable.Return<T2>(_t2);여기서 유형을 결정하기 위해 컴파일러에게 맡기지 않고 사용하려고 합니다. 버그가있을 수 있습니다. 물론, 그것은 긴 기회입니다.
cwharris

6
Windows Phone에서 Rx에 많은 문제가 있습니다. 나를 위해 컴파일하고 MethodNotFoundException실제로 포함하는 클래스를 호출하려고 할 때 발생합니다. 나를 위해 VS Update 2의 릴리스 버전으로 업그레이드하는 것이 효과적이었습니다. 실제로 무엇이 잘못되었는지는 아직 모르겠지만 모든 것에 최신 업데이트를 사용하고 있는지 확인하십시오. 분명히 우리의 문제는 약간 다르지만 지침을 제공하는 데 도움이 될 수 있습니다.
Matthew Haugen

5
질문은 무엇입니까- '어떤 아이디어?' -충돌을 멈추는 방법을 알고 싶습니까?
Tim Lovell-Smith

1
_t1.Foo <missing type here> (그리고 여기에도);
akbar ali

답변:


1
 _t1.Foo<type>(type);

유형 선언이 누락되었습니다. 컴파일러가 추측하고 있습니다 (그리고 잘못 추측합니다). 모든 것을 엄격하게 입력하면 실행됩니다.


이것은 단서가 아니며 IObserver 및 IObservable을 직접 구현할 수 있으며 모든 것이 잘 작동합니다.
YURIY Naydenov

디버거가 컴파일러에 대한 연결을 생성하는 것처럼 보이며 디버거도 모든 변수를 엄격하게 형식화해야합니다. 디버거가 올바른 것으로 추측하고 컴파일러는 어떻게 든 그것에서 쿼리를 가져옵니다. 디버거가 문제를 해결하는 이유는 중요하지 않으며 근본 원인이 발견되었습니다.
Japes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.