【发布时间】:2014-02-26 19:29:25
【问题描述】:
我有一个在 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 个参数 - 委托和对象 []。
所以这留下了几个我无法弄清楚的问题
- 为什么它没有在我的本地机器上编译失败?这就是我所期望的(这不是我写的代码,我继承了它)。通过传递参数(Action 方法),有一个类型(Dispatcher)和一个在该类型上被调用的方法(Invoke)。类型中定义了这样的方法,返回类型为void,不应该选择那个方法吗?为什么它选择另一种方法来调用。我不是在这里谈论方法重载,因为我知道返回类型不是方法 signature 的一部分,并且在重载方法时,正在考虑方法签名。
- 由于我的本地机器和构建服务器上的源代码相同,并且构建服务器上的编译失败,这两种环境有什么区别?是某种编译器开关/配置,还是认为让相同的代码在一个环境中编译而在另一个环境中失败?
如果您需要更多信息,请告诉我。
【问题讨论】:
标签: c#-4.0