错误的方法调用?

时间:2014-02-26 19:29:26

标签: c#-4.0

我有一个方法可以在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;
        }
    }

Dispatcher(在System.Windows.Threading中)定义了一个void Invoke方法,它接受Action参数。

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

现在我在本地编译的代码片段会在构建服务器(TeamCity 5)上引发异常并显示错误消息 - 无法将类型'void'隐式转换为'object'

这让我想知道为什么它在我的本地机器上编译,但是在Build Agent上没有这样做。当我将鼠标悬停在Invoke方法上时,intellisense显示它将调用具有返回参数的Invoke方法,并采用2个参数 - Delegate和object []。

enter image description here

因此,我提出了几个我无法弄清楚的问题

  1. 为什么它不能在我的本地机器上编译?这就是我所期望的(这不是我写的代码,我继承了它)。通过传递参数(操作方法),有一种类型( Dispatcher )和在该类型上调用的方法(调用)。在类型中定义了这样的方法,返回类型为void,不应该选择该方法吗?为什么选择另一种方法来调用。我不是在讨论方法重载,因为我知道返回类型不是方法 签名 的一部分,并且在重载方法时,正在考虑方法签名。 / LI>
  2. 由于源代码在我的本地机器和构建服务器上是相同的,并且构建服务器上的编译失败,这两个环境之间有什么区别?它是某种编译器开关/配置,还是被认为是在一个环境中编译相同的代码而在另一个环境中编译失败?
  3. 如果您需要其他信息,请与我们联系。

1 个答案:

答案 0 :(得分:1)

在构建服务器上进行编译时,您的代码正在调用重载void Dispatcher.Invoke(Action),它不会返回值,因此return语句无法编译(没有任何内容可以返回)。

该方法仅从.NET 4.5开始提供,而早期版本an overload与您调用它的方式兼容,是IntelliSense屏幕截图中显示的方法。

简而言之,问题是您自己的系统和构建服务器编译针对不同版本的.NET。 4.5中添加的重载是根据重载决策规则更好地匹配呼叫站点但不幸的是它将呼叫站点变为无效语句。