Почему.NET System.Version "2.0" отличается от "2.0.0.0"?
Я недавно столкнулся с загадкой, когда это сравнение не удалось:
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 и 1,000000 независимо от того, сколько нулей я добавляю.
2 ответа
Согласно документам
"Разница в номере сборки представляет собой перекомпиляцию одного и того же источника. При изменении процессора, платформы или компилятора могут использоваться разные номера сборки".
Третий аргумент конструктора - это номер сборки, который инициализируется значением -1, если не назначен при создании объекта Version. Возможно, объект Version может быть создан до того, как сборка или сборки будут собраны впервые, например, в некоторой логике конвейера сборки. Как только сборки собраны и номер сборки существует, новый объект Version с номером сборки будет следовать за версией без.
Поскольку перегрузки операторов "больше чем" и "меньше чем" на самом деле связаны с определением относительного времени сборок (т. Е. Предшествует ли одна версия другой или предшествует другой), версия, которая никогда не была построена или пересмотрена, "меньше, чем" версия, которая имеет,
Вот мой взгляд на это. Я могу быть совершенно неправ, но, как вы просите обоснование, я вижу номера версий и их использование.
Номера версий на самом деле не числа, а просто идентификаторы с некоторой семантикой и логикой сравнения, основанной на этой семантике. Частью этой логики является возможность проверки совместимости двух версий.
В этом смысле, 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.1
не то же самое, что 2.0.0.0