簡體   English   中英

使用Convert.ToInt64進行類型推斷失敗

[英]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方法-它可能是任何重載(如果有)。

因此,您需要明確地說valuelong 這告訴編譯器您知道自己在做什么,否則,您會收到運行時錯誤(例如,如果ToInt64返回string )。 或者,您可以刪除動態調用(通過將dynamic替換為string )-此時,我們確切知道正在調用哪個ToInt64方法。

當您編寫DoubleIt() -您實際上並未綁定到擴展方法。 dynamic不關心您編寫的內容,並且會在運行時嘗試將其作為對象本身上的一種方法進行解析-並且不考慮擴展方法

擴展方法只是語法糖,可以在IL中編譯為:

SomeStaticClass.DoubleIt(value)可以更清楚地說明為什么它無法運行value.DoubleIt()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM