2016-09-23 4 views
0

Я получаю InvalidCastException при запуске моего кода в Xamarin iOS. Этого не происходит для .NET или Android - только для iOS. Вот детали исключения:InvalidCastException в Xamarin iOS

на Microsoft.Scripting.Interpreter.EqualInstruction + EqualInt64.DoCalculate (System.Object л, System.Object г) [0x00000] в /Пользователи/строитель/данные/дорожки/3426/6c3fee4d/источник/Xamarin-macios/_ios-сборки/Library/Frameworks/Xamarin.iOS.framework/Версии/мерзавец/SRC/моно/MCS/класс/DLR/Время воспроизведения/Microsoft.Dynamic/Переводчик/Инструкции/EqualInstruction. cs: 84 в Microsoft.Scripting.Interpreter.ComparisonInstruction.Calculate (System.Object l, System.Object r) [0x00015] в /Пользователи/строитель/данные/полосы/3426/6c3fee4d/source/xamarin-macios/_ios-сборка/Library/Frameworks/Xamarin.iOS.framework/Версия/мерзавец/SRC/моно/м cs/class/dlr/Runtime/Microsoft.Dynamic/Interpreter/Инструкции/ComparisonInstruction.cs: 44 в Microsoft.Scripting.Interpreter.ArithmeticInstruction.Run (Microsoft.Scripting.Interpreter.InterpretedFrame frame) [0x00020] в /Пользователи /builder/data/lanes/3426/6c3fee4d/source/xamarin-macios/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/src/mono/mcs/class/dlr/Runtime/Microsoft.Dynamic /Interpreter/Instructions/ArithmeticInstruction.cs:45 на Microsoft.Scripting.Interpreter.Interpreter.Run (Microsoft.Scripting.Interpreter.InterpretedFrame кадра) [0x0001b] в /Users/строитель/данных/дорожки/3426/6c3fee4d/source/xamarin-macios/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Версии/git/src/mono/mcs/class/dlr/Runtime/Microsoft.Dynamic/Interpreter/Interpreter.cs: 126

--- Конец трассировки стека из предыдущего места, где было брошено исключение --- на System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] в /Пользователи/строитель/данные/дорожки/3426 /6c3fee4d/source/xamarin-macios/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions/git/src/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:143 в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Задача System.Threading.Tasks.Task) [0x00047] в /Пользователи/builder/data/lanes/3426/6c3fee4d/source/xamarin-macios/_ios-build/Библиотека/Frameworks/Xamarin.iOS.framework/Версии/мерзавец/SRC/моно/MCS/класс/referencesource/mscorlib/система/выполнения/compilerservices/Таска waiter.cs: 187 в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task задача) [0x0002e] в /Users/строитель/данных/полос/3426/6c3fee4d/источник/xamarin- macios/_ios-build/Библиотека/Рамки/Xamarin.iOS.framework/Версии/git/src/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs: 156 в System.Runtime.CompilerServices .TaskAwaiter.ValidateEnd (Задача System.Threading.Tasks.Task) [0x0000b] в /Users/builder/data/lanes/3426/6c3fee4d/source/xamarin-macios/_ios-build/Library/Frameworks/Xamarin.iOS .framework/Версии/git/src/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs: 128 в System.Runtime.CompilerServices.TaskAwait er`1 [TResult] .GetResult() [0x00000] в /Users/builder/data/lanes/3426/6c3fee4d/source/xamarin-macios/_ios-build/Library/Frameworks/Xamarin.iOS.framework/Versions /git/src/mono/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/TaskAwaiter.cs:357 на XamarinFormsPortable.Models.TweetingViewModel + d__4.MoveNext () [0x00328] в C: \ Проекты \ LinqToTwitter \ Samples \ Xamarin4 \ XamarinFormsPortable \ XamarinFormsPortable \ XamarinFormsPortable \ Models \ TweetingViewModel.CS: 54

код, который вызывает проблемы является LINQ к Twitter запрос:

  var ctx = new TwitterContext(auth); 
      ulong InitialTweetId = 1; 
      int MaximumTweetsToRetrieve = 20; 

      var tweetsQuery = from tweet in ctx.Status 
           where tweet.Type == StatusType.User && 
           tweet.ScreenName == "reinoso_alvaro" && 
           tweet.Text.Contains("#buenosdias") && 
           tweet.IncludeRetweets == false && 
           tweet.TrimUser == true && 
           tweet.ExcludeReplies == true && 
           tweet.SinceID == InitialTweetId && 
           tweet.Count == MaximumTweetsToRetrieve 
           select tweet; 
      var tweetList = await tweetsQuery.ToListAsync(); 

условие, которое вызывает проблемы является SinceID, который ulong. Однако из трассировки стека вы можете видеть, что последний метод равен EqualInt64, который равен long. Я искал все места, где я работал с SinceID, и все они ulong. Исключение происходит на последней строке: awaiting tweetsQuery.ToListAsync()

Реализация ToListAsync является:

public static async Task<List<T>> ToListAsync<T>(this IQueryable<T> query) 
    { 
     var provider = query.Provider as TwitterQueryProvider; 

     IEnumerable<T> results = (IEnumerable<T>)await provider.ExecuteAsync<IEnumerable<T>>(query.Expression).ConfigureAwait(false); 

     return results.ToList(); 
    } 

ExecuteAsync бежит и возвращает результаты. Тогда исключение возникает при материализации через results.ToList().

Это происходит только на iOS.

+0

и без 'tweet.SinceID == InitialTweetId' он работает? –

+0

@ Sven-MichaelStübe Without SinceID, он не генерирует исключения, но логически это не сработает, потому что это необходимо для подкачки. –

ответ

0

Возможный способом обхода является приведение свойства Status.SinceID в выражении:

[...] 
&& (long)tweet.SinceID == sinceStatusId // sinceStatusId is a long 
[...] 

Интересный момент, объект интерпретатора команды сравнения Моно для целых чисел без знака, назначенных экземпляров своих подписанных аналогов (https://github.com/mono/mono/blob/mono-4.8.0-branch/mcs/class/dlr/Runtime/Microsoft.Dynamic/Interpreter/Instructions/EqualInstruction.cs, линия 155 до 157):

case TypeCode.UInt16: return _UInt16 ?? (_UInt16 = new EqualInt16()); 
case TypeCode.UInt32: return _UInt32 ?? (_UInt32 = new EqualInt32()); 
case TypeCode.UInt64: return _UInt64 ?? (_UInt64 = new EqualInt64()); 

Не уверен, что это намеренно или нет.

+0

Несмотря на то, что приведение в действие до сегодняшнего дня может работать сегодня, так как ID намеренно улунгов способен обрабатывать потенциал роста. Кроме того, подписанный не является семантически правильным в этом сценарии. Тем не менее, это будет временная работа. –