【问题标题】:Version object is comparing two versions incorrectly版本对象正在错误地比较两个版本
【发布时间】:2012-12-02 17:17:26
【问题描述】:

我正在使用 Version 对象来针对两个版本号运行 CompareTo 并在版本 >= versionA 时使 X 发生。

我的问题是,在下面的代码中,CompareTo 声明 VersionB 大于 VersionA。

Version versionA = new Version("2.12");
Version versionB = new Version("2.121");

switch (versionB.CompareTo(versionA))
                {
                    case 0: // Equal To
                        _doThis = true;
                        break;
                    case 1: // Greater Than
                        _doThat = true;
                        break;
                    case 2: // Less Than
                        _doNothing = true;
                        break;
                }

此比较适用于案例 2。我正在使用正则表达式来匹配传递给该方法的固件版本,如您在此处看到的:

^\S+\s(?(\d+.*)+)\s*.*$

我将接受类似于“2.12 版”的内容,这个正则表达式将只留下“2.12”,然后将其初始化为一个版本对象。

有人知道为什么 .NET 告诉我 2.12 版比 2.121 版更新吗?


编辑:

我已将我的代码更改为如下:

Version versionA = new Version("2.12");
Version versionB = new Version("2.121");

if (versionB.CompareTo(versionA) >= 0)
{
     _doThis = true;
}

而且它工作正常。现在,如果我比较“2.11”和“2.121”,它也会返回 1。这个比较不应该返回 -1 吗?

【问题讨论】:

  • the CompareTo is declaring that VersionB is greater than VersionA -- 也许我遗漏了一些东西,但是 121 > 12,所以这不完全符合预期吗?
  • 版本 B 大于版本 A
  • 是的,你的 switch 语句对可能的结果集没有意义。
  • 我想知道当它从不返回 2 时你是如何进入 case 2 的,实际上返回范围是 -1,0,1
  • 去掉开关小于为负,0为等于,正为大于。结果的幅度越大,它们的差异就越大。

标签: c# asp.net .net version compareto


【解决方案1】:

Version 类为比较运算符提供了运算符重载,为什么不使用它们呢?它确实使代码的意图更加清晰。

意思是你可以简单地写:

if(versionB >= versionA) {
  _doThis = true;
}

对我来说,这比调用 CompareTo 并检查返回值的符号要清楚得多。

【讨论】:

【解决方案2】:

Version.CompareTo(Version) 返回一个有符号整数

negative means it's before
zero the same
positive after.

结果的幅度越大,版本之间的距离就越远。

去掉switch,或者先条件返回compareto。

【讨论】:

  • 我正要对此发表评论。我的 switch 语句不正确。有时需要从代码中退后一步并获得一些外部输入来帮助您意识到自己的错误。谢谢!
  • 我在原始帖子中添加了一个新发现,请您查看一下并告诉我您认为原因是什么?谢谢。
  • 看起来你已经从你的评论中猜到了
猜你喜欢
  • 2022-11-11
  • 2013-09-06
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
  • 2011-12-16
相关资源
最近更新 更多