【问题标题】:Wrong method call?错误的方法调用?
【发布时间】: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 个参数 - 委托和对象 []。

所以这留下了几个我无法弄清楚的问题

  1. 为什么它没有在我的本地机器上编译失败?这就是我所期望的(这不是我写的代码,我继承了它)。通过传递参数(Action 方法),有一个类型(Dispatcher)和一个在该类型上被调用的方法(Invoke)。类型中定义了这样的方法,返回类型为void,不应该选择那个方法吗?为什么它选择另一种方法来调用。我不是在这里谈论方法重载,因为我知道返回类型不是方法 signature 的一部分,并且在重载方法时,正在考虑方法签名。
  2. 由于我的本地机器和构建服务器上的源代码相同,并且构建服务器上的编译失败,这两种环境有什么区别?是某种编译器开关/配置,还是认为让相同的代码在一个环境中编译而在另一个环境中失败?

如果您需要更多信息,请告诉我。

【问题讨论】:

    标签: c#-4.0


    【解决方案1】:

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

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

    简而言之,问题在于您自己的系统和构建服务器针对不同版本的 .NET 进行编译。根据重载解析规则,4.5 中添加的重载更适合调用站点,但不幸的是它会将调用站点变成无效语句。

    【讨论】:

    • 谢谢,你说得对,我在本地机器上更改了目标平台,但编译失败。令人困惑的是,我反编译了 Dispatcher 类,我可以看到 void Invoke(Action),所以我认为它适用于 .net 4.0。
    猜你喜欢
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多