Compilado com VS 2012
, com tipo de projeto, WP 8.0
o código a seguir falhará se o depurador não estiver anexado.
De alguma forma, se o depurador não estiver conectado, as otimizações do compilador estragam o código interno Crash()
- consulte os comentários no código.
Testado no Lumia 1520 (8.1) e Lumia 630 (8.0) .
Alguma ideia de por que isso está ocorrendo?
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());
}
}
c#
.net
compiler-errors
windows-phone
system.reactive
Yuriy Naydenov
fonte
fonte
Observable.Return<T2>(_t2);
, em vez de deixar para o compilador decidir o tipo aqui. Pode haver um bug com isso. Concedido, isso é um tiro no escuro.MethodNotFoundException
quando eu realmente tentasse chamar a classe contida. Para mim, a atualização para a versão de lançamento do VS Update 2 funcionou. Ainda não tenho ideia do que estava realmente errado, mas certifique-se de usar as atualizações mais recentes em tudo. Obviamente, nossos problemas são um pouco diferentes, mas isso pode ajudar a nos dar alguma orientação.Respostas:
Está faltando a declaração de tipo. O compilador está adivinhando (e adivinhando errado). Digite tudo estritamente e ele deve ser executado.
fonte