2014-02-26 80 views
1

我有一個方法調用Dispatcher上的一些操作。錯誤的方法調用?

public static object Invoke(Dispatcher dispatcher, Action method) 
    { 
     try 
     { 
      ValidateArgs(dispatcher, method); 
      return dispatcher.Invoke(method); 
     } 
     catch (Exception ex) 
     { 
      //Log exception 
      Logger.Error(ex.Message, ex); 
      throw; 
     } 
    } 

分派器(在System.Windows.Threading程序)具有限定的空隙Invoke方法,即採取行動參數。

public void Invoke(Action callback) 
     { 
      Invoke(callback, DispatcherPriority.Send, CancellationToken.None, TimeSpan.FromMilliseconds(-1)); 
     } 

現在的代碼我有,在本地編譯,但是拋出生成服務器上,並顯示錯誤消息的異常(TeamCity的5) - 無法隱式轉換類型「無效」到「對象」

這讓我想知道爲什麼它會在我的本地機器上編譯,但是無法在Build Agent上進行編譯。當我將鼠標懸停在Invoke方法上時,intellisense顯示它將調用具有返回參數的Invoke方法,並使用2個參數 - Delegate和object []。

enter image description here

所以這個左派幾個問題我想不通

  1. 爲什麼它沒有失敗編譯我的本地機器上?這就是我所期望的(這不是我寫的代碼,我繼承了它)。有一種類型(調度員)和一種通過傳遞參數(動作方法)在該類型上調用的方法(調用)。在類型中定義了這樣的方法,返回類型爲void,是否不應選擇該方法?爲什麼它選擇另一種方法來調用。我不是在說這裏的方法重載,因爲我知道返回類型不是方法簽名的一部分,並且在重載方法的同時,正在考慮方法簽名。
  2. 由於我的本地機器和Build服務器上的源代碼是相同的,編譯服務器上的編譯失敗,這兩種環境有什麼區別?它是某種編譯器開關/配置,還是正在考慮讓我們相同的代碼在一個環境中編譯並在另一個環境中失敗?

如果您需要更多信息,請讓我知道。

回答

1

在編譯服務器上編譯時,您的代碼調用過載void Dispatcher.Invoke(Action),該過載不返回值,因此return語句無法編譯(沒有任何內容可以返回)。

該方法只能從.NET 4.5開始使用,而早期版本an overload與您調用的方式兼容,這是IntelliSense屏幕截圖中顯示的方法。

簡而言之,問題是您的系統和構建服務器編譯的目標是.NET的不同版本。根據重載解析規則,在4.5中添加的重載更適合呼叫站點,但不幸的是它將呼叫站點變爲無效聲明。

+0

謝謝,你是對的,我改變了我的本地機器上的目標平臺,它沒有編譯。事實是,我反編譯Dispatcher類,並且可以看到void Invoke(Action),所以我認爲它適用於.net 4.0。 –