为什么是.NET System.Version" 2.0"不同于" 2.0.0.0"?

时间:2015-11-20 08:51:55

标签: c# system.version

当这个比较失败时,我最近遇到了障碍:

System.Version compareVersion = new Version(2, 0, 0, 0);
System.Version actualVersion = new Version(2, 0);

if(actualVersion >= compareVersion) // returns false

我理解它背后的实现机制,因为最后两位数字被初始化为-1而-1小于0。

但是:背后的理由是什么?从数学的角度来看,无论我追加多少个零,1和1.0之间都没有差别.1000000。

2 个答案:

答案 0 :(得分:1)

根据docs

“内部版本号的差异表示对同一源代码的重新编译。当处理器,平台或编译器发生更改时,可能会使用不同的内部版本号。”

构造函数的第三个参数是构建号,如果在构造Version对象时未分配,则构建号初始化为-1。可以想象,可以在第一次构建组件或组件之前创建Version对象,例如在一些构建管道逻辑中。构建程序集并且存在内部版本号后,具有内部版本号的新版本对象将成功启动版本。

由于“大于”和“小于”运算符重载实际上是关于确定构建的相对时间(即一个版本是否早于或后一个版本),从未构建或修改过的版本“小于”a版本有。

答案 1 :(得分:1)

这是我对它的看法。我可能完全错了,但正如你要求的理由,这就是我看到版本号及其用途的方式。

版本号实际上不是数字,它们实际上只是具有一些语义的标识符和基于该语义的比较逻辑。 部分逻辑是能够检查两个版本是否兼容。

从这个意义上讲,2.0代表任何2.0衍生品,或2.0.*.*。 当您将关系运算符与版本一起使用时,您实际上想要回答兼容性问题,其中>=表示类似is backwards compatible with的内容。

因此,V1 >= V2意味着is V1 backwards compatible with V2

  • 2.0.0.0 >= 2.0.*.* - >是的,因为2.0.0.0应该能够在支持声称支持2.0.*.*
  • 的系统上运行
  • 2.0.*.* >= 2.0.0.0 - >是的,因为不是每个2.0.*.*版本都保证与2.0.0.0
  • 兼容

[编辑:回答评论]

  

不应该2.0.*.*至少等于2.0.0.0吗?因为(用你的话说)" 2.0.0.0应该能够支持系统支持声称支持2.0.*.*"

我认为让您感到困惑的是,我们选择了2.0.0.0,它被直观地理解为基本版本,因此在逻辑上等同于2.0.*.*,但它不是。

它不应该相等,因为2.0.*.*表示任何 2.0版本(不仅仅是被挑选的特定版本),因此ANY_20_VERSION == 2000_VERSION为假。换句话说,这意味着任何2.0衍生品都应该能够满足关系(不仅仅是被选中的特定关系),显然2.0.0.12.0.0.0不一样