[Mono-dev] InvalidCastException - which makes no sense
David Nelson
eatdrinksleepcode at gmail.com
Fri Oct 24 21:36:01 UTC 2014
Eric Lippert has a good write up about this behavior:
http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx
> On Oct 24, 2014, at 5:28 PM, Miguel de Icaza <miguel at xamarin.com> wrote:
>
> Hello,
>
> What happens is this. The value returned from ExecuteScalar is boxed. This basically means that you have a wrapper that indicates the type of the boxed object, as well as the contents of the boxed object.
>
> The reality is that: (Int64) (scalar) and (Int32) (Int64) (scalar) perform different operations on this context.
>
> This is what actually happens on the second case:
>
> tmp = Unbox-the-value-which-i-know-is-a-64-bit-value (scalar)
> tmp32 = explicit-cast-64-to-32 tmp
>
> They happen to have the same syntax, but they are different operations.
>
> When you tried doing "(Int32) scalar", you were telling the compiler "unbox-the-value-which-i-know-is-32-bit-value", but when the runtime went to unbox this, it noticed it was 64, so it told you "InvalidCastException"
>
>
>
>
>> On Fri, Oct 24, 2014 at 5:23 PM, Edward Ned Harvey (mono) <edward.harvey.mono at clevertrove.com> wrote:
>> This is a fun one. I'd love it if anyone could explain this to me.
>>
>>
>>
>> using (var command = new SqliteCommand(@"SELECT COUNT(*) FROM someTable WHERE someColumn = @someValue ", dbConn))
>>
>> {
>>
>> command.Parameters.Add(new SqliteParameter("someValue", "foobar"));
>>
>> object scalar = command.ExecuteScalar(); // object returned has type Int64
>>
>> Int64 count64 = (Int64)(scalar); // works fine. Value is 0
>>
>> Int32 count32 = (Int32)(Int64)(scalar); // works fine. Value is 0
>>
>> Int32 count = (Int32)(scalar); // throws InvalidCastException
>>
>> ...
>>
>> }
>>
>>
>>
>> In the above, scalar is obviously an object, but the object returned by ExecuteScalar() is of type Int64. The value is 0.
>>
>>
>>
>> This works fine:
>>
>> Int64 count64 = (Int64)(scalar);
>>
>>
>>
>> This works fine:
>>
>> Int32 count32 = (Int32)(Int64)(scalar);
>>
>>
>>
>> This throws InvalidCastException:
>>
>> Int32 count = (Int32)(scalar);
>>
>>
>>
>> The best I can gather, the object needs to be cast to Int64 before it can be cast to Int32. Which makes no sense to me, but that's the way it is.
>>
>>
>> _______________________________________________
>> Mono-devel-list mailing list
>> Mono-devel-list at lists.ximian.com
>> http://lists.ximian.com/mailman/listinfo/mono-devel-list
>
> _______________________________________________
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-devel-list
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ximian.com/pipermail/mono-devel-list/attachments/20141024/32fa6bf3/attachment.html>
More information about the Mono-devel-list
mailing list