<div dir="ltr">Hello,<div><br></div><div>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.</div><div><br></div><div>The reality is that: (Int64) (scalar) and (Int32) (Int64) (scalar) perform different operations on this context.</div><div><br></div><div>This is what actually happens on the second case:</div><div><br></div><div>tmp = Unbox-the-value-which-i-know-is-a-64-bit-value (scalar)</div><div>tmp32 = explicit-cast-64-to-32 tmp</div><div><br></div><div>They happen to have the same syntax, but they are different operations.</div><div><br></div><div>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"</div><div><br></div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Oct 24, 2014 at 5:23 PM, Edward Ned Harvey (mono) <span dir="ltr"><<a href="mailto:edward.harvey.mono@clevertrove.com" target="_blank">edward.harvey.mono@clevertrove.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<div lang="EN-US" link="#0563C1" vlink="#954F72">
<div>
<p class="MsoNormal">This is a fun one.  I'd love it if anyone could explain this to me.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal" style="margin-left:.5in">using (var command = new SqliteCommand(@"SELECT COUNT(*) FROM someTable WHERE someColumn = @someValue ", dbConn))<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">{<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">    command.Parameters.Add(new SqliteParameter("someValue", "foobar"));<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">    object scalar = command.ExecuteScalar();        // object returned has type Int64<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">    Int64 count64 = (Int64)(scalar);                              // works fine.  Value is 0<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">    Int32 count32 = (Int32)(Int64)(scalar);                // works fine.  Value is 0<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">    Int32 count = (Int32)(scalar);                   // throws InvalidCastException<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">    ...<u></u><u></u></p>
<p class="MsoNormal" style="margin-left:.5in">}<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">In the above, scalar is obviously an object, but the object returned by ExecuteScalar() is of type Int64.  The value is 0.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">This works fine:<u></u><u></u></p>
<p class="MsoNormal">Int64 count64 = (Int64)(scalar);<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">This works fine:<u></u><u></u></p>
<p class="MsoNormal">Int32 count32 = (Int32)(Int64)(scalar);<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">This throws InvalidCastException:<u></u><u></u></p>
<p class="MsoNormal">Int32 count = (Int32)(scalar);<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">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.<u></u><u></u></p>
</div>
</div>

<br>_______________________________________________<br>
Mono-devel-list mailing list<br>
<a href="mailto:Mono-devel-list@lists.ximian.com">Mono-devel-list@lists.ximian.com</a><br>
<a href="http://lists.ximian.com/mailman/listinfo/mono-devel-list" target="_blank">http://lists.ximian.com/mailman/listinfo/mono-devel-list</a><br>
<br></blockquote></div><br></div>