2015-02-05 63 views
1

我試圖執行錯誤處理我的計劃之內的組件類,但不斷收到以下錯誤消息:的方法類型參數不能從輔助型的使用推斷

錯誤1個類型參數的方法 'Marketplace.ErrorHandlingComponent.Invoke(System.Func,int, System.TimeSpan)'不能從使用情況中推斷出來。嘗試明確指定類型參數 。

我不知道什麼是嘗試指定類型參數明確意思。

MainWindow.xaml.cs

public void SetPlotList(int filterReference) 
    { 
     // Fill plot list view 
     List<PlotComponent.PlotList> plotList = PlotComponent.SelectPlotLists(filterReference); 

     // Find the plot list item in the new list 
     PlotComponent.PlotList selectPlotList = 
      plotList.Find(x => Convert.ToInt32(x.PlotId) == _focusPlotReference); 

     Dispatcher.Invoke(
      (() => 
      { 
       PlotListView.ItemsSource = plotList; 
       if (selectPlotList != null) 
       { 
        PlotListView.SelectedItem = selectPlotList; 
       } 
      })); 

     int jobSum = 0; 
     int bidSum = 0; 
     foreach (PlotComponent.PlotList item in PlotListView.Items) 
     { 
      jobSum += Convert.ToInt32(item.Jobs); 
      bidSum += Convert.ToInt32(item.Bids); 
     } 

     // Determine job/bid list ratio 
     Dispatcher.BeginInvoke(
      new ThreadStart(() => JobBidRatioTextBlock.Text = jobSum + " jobs - " + bidSum + " bids")); 
    } 

    private void ValidateTextbox() 
    { 
     if (Regex.IsMatch(FilterTextBox.Text, "[^0-9]") || FilterTextBox.Text == "") return; 
     try 
     { 
      ErrorHandlingComponent.Invoke(() => SetPlotList(Convert.ToInt32(FilterTextBox.Text)), 3, TimeSpan.FromSeconds(1)); 
     } 
     catch 
     { 
      FilterTextBox.Text = null; 
     } 
    } 

ErrorHandlingComponent.cs

public static T Invoke<T>(Func<T> func, int tryCount, TimeSpan tryInterval) 
    { 
     if (tryCount < 1) 
     { 
      throw new ArgumentOutOfRangeException("tryCount"); 
     } 

     while (true) 
     { 
      try 
      { 
       return func(); 
      } 
      catch (Exception ex) 
      { 
       if (--tryCount > 0) 
       { 
        Thread.Sleep(tryInterval); 
        continue; 
       } 
       LogError(ex.ToString()); 
       throw; 
      } 
     } 
    } 

回答

1

您的lambda的內容是SetPlotList(Convert.ToInt32(FilterTextBox.Text))

SetPlotList返回void,但Invoke假定提供給它的lambda返回一些(非void)類型。它不能推斷出lambda返回的類型,因爲它不返回類型SetPlotList返回了一些東西,那麼Invoke調用將正常工作。

+0

如何調整'Invoke'調用來迎合返回void和non-void類型的方法? – methuselah 2015-02-05 16:48:53

+0

@methuselah它需要接受一個不返回值的委託。如果它也不需要接受任何參數,那麼可以使用「Action」。當然,如果考慮到委託人沒有回報價值的事實,該方法的實施將需要顯着改變。如果你想能夠同時擁有,你可以編寫第二個非泛型重載。 – Servy 2015-02-05 16:50:15

0

SetPlotList是空隙的方法,但ErrorHandlingComponent.Invoke期望一個Func<T>作爲它的第一個參數。它需要調用Func並返回func的返回值。由於您試圖將它傳遞給void方法,編譯器會抱怨。

+0

如何調整'Invoke'調用以迎合返回void和non-void類型的方法? – methuselah 2015-02-05 16:49:38

相關問題