无法从辅助类型的用法推断出方法的类型参数

时间:2015-02-05 16:40:42

标签: c# wpf

我正在尝试在程序中执行错误处理组件类,但不断收到以下错误消息:

  

错误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;
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

lambda的内容为SetPlotList(Convert.ToInt32(FilterTextBox.Text))

SetPlotList返回void,但Invoke假设提供给它的lambda返回一些(非void)类型。它无法推断lambda返回的类型,因为它不返回类型SetPlotList返回了一些内容,然后Invoke调用才能正常运行。

答案 1 :(得分:0)

SetPlotList是一种void方法,但ErrorHandlingComponent.Invoke期望Func<T>作为其第一个参数。它需要调用Func并返回func的返回值。由于你试图传递一个void方法,编译器会抱怨。