[英]Type inference failure with Convert.ToInt64
以下代碼段
static class Program
{
public static void Main()
{
dynamic data = "0001010";
var value = System.Convert.ToInt64(data);
System.Console.Out.WriteLine(value.DoubleIt());
}
static long DoubleIt(this long source)
{
return source * 2;
}
}
失敗於
Unhandled Exception: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'long' does not contain a definition for 'DoubleIt'
at CallSite.Target(Closure , CallSite , Object )
at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)
at Program.Main()
而小的變化
long value = System.Convert.ToInt64(data);
或的
string data = "0001010";
足以完成這項工作。
觀察IL,似乎前者試圖通過反射加載DoubleIt,而后者則導致DoubleIt被靜態綁定。
有什么建議為什么會這樣?
因為value
實際上是dynamic
。 在編譯時,我們實際上並不知道正在調用哪個System.Convert.ToInt64
方法-它可能是任何重載(如果有)。
因此,您需要明確地說value
是long
。 這告訴編譯器您知道自己在做什么,否則,您會收到運行時錯誤(例如,如果ToInt64
返回string
)。 或者,您可以刪除動態調用(通過將dynamic
替換為string
)-此時,我們確切知道正在調用哪個ToInt64
方法。
當您編寫DoubleIt()
-您實際上並未綁定到擴展方法。 dynamic
不關心您編寫的內容,並且會在運行時嘗試將其作為對象本身上的一種方法進行解析-並且不考慮擴展方法
擴展方法只是語法糖,可以在IL中編譯為:
SomeStaticClass.DoubleIt(value)
可以更清楚地說明為什么它無法運行value.DoubleIt()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.