diff --git a/Semver.Benchmarks/DecimalDigits.cs b/Semver.Benchmarks/DecimalDigits.cs index f568144..cff2ad1 100644 --- a/Semver.Benchmarks/DecimalDigits.cs +++ b/Semver.Benchmarks/DecimalDigits.cs @@ -6,6 +6,7 @@ namespace Semver.Benchmarks { [SimpleJob(RuntimeMoniker.Net461)] [SimpleJob(RuntimeMoniker.NetCoreApp21)] + [SimpleJob(RuntimeMoniker.NetCoreApp31)] public class DecimalDigits { [Params(99, 999, 999_999, int.MaxValue)] diff --git a/Semver.Benchmarks/IsDigits.cs b/Semver.Benchmarks/IsDigits.cs index 0621269..a9e3829 100644 --- a/Semver.Benchmarks/IsDigits.cs +++ b/Semver.Benchmarks/IsDigits.cs @@ -5,6 +5,7 @@ namespace Semver.Benchmarks { [SimpleJob(RuntimeMoniker.Net461)] [SimpleJob(RuntimeMoniker.NetCoreApp21)] + [SimpleJob(RuntimeMoniker.NetCoreApp31)] public class IsDigits { private const string Value = "245413548946516575165756156751323245451984"; diff --git a/Semver.Benchmarks/NewSemVersion.cs b/Semver.Benchmarks/NewSemVersion.cs index 6218ccf..2bc8a00 100644 --- a/Semver.Benchmarks/NewSemVersion.cs +++ b/Semver.Benchmarks/NewSemVersion.cs @@ -7,6 +7,7 @@ namespace Semver.Benchmarks { [SimpleJob(RuntimeMoniker.Net461)] [SimpleJob(RuntimeMoniker.NetCoreApp21)] + [SimpleJob(RuntimeMoniker.NetCoreApp31)] public class NewSemVersion { private const string Prerelease = "asdf.24534634.sdfdg.02343sd"; diff --git a/Semver.Benchmarks/Parsing.cs b/Semver.Benchmarks/Parsing.cs index b2f7298..3a9f8ab 100644 --- a/Semver.Benchmarks/Parsing.cs +++ b/Semver.Benchmarks/Parsing.cs @@ -12,6 +12,7 @@ namespace Semver.Benchmarks /// [SimpleJob(RuntimeMoniker.Net461)] [SimpleJob(RuntimeMoniker.NetCoreApp21)] + [SimpleJob(RuntimeMoniker.NetCoreApp31)] public abstract class Parsing { protected const int VersionCount = 1_000; diff --git a/Semver.Benchmarks/Program.cs b/Semver.Benchmarks/Program.cs index ea7bd58..cbf3545 100644 --- a/Semver.Benchmarks/Program.cs +++ b/Semver.Benchmarks/Program.cs @@ -10,7 +10,7 @@ public static void Main(string[] args) //var random = new Random(); //var version = BasicPrereleaseParsing.RandomVersion(random); //var seed = random.Next(int.MinValue, int.MaxValue); - BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args).ToList(); + _ = BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args).ToList(); } } } diff --git a/Semver.Benchmarks/Semver.Benchmarks.csproj b/Semver.Benchmarks/Semver.Benchmarks.csproj index 605bc8a..ad91200 100644 --- a/Semver.Benchmarks/Semver.Benchmarks.csproj +++ b/Semver.Benchmarks/Semver.Benchmarks.csproj @@ -2,22 +2,14 @@ Exe - netcoreapp2.1;net461 + netcoreapp2.1;netcoreapp3.1;net461 Semver.Benchmarks.Program AnyCPU - - $(DefineConstants);NETSTANDARD - - - - $(DefineConstants);NET461 - - - 0.13.0 + 0.13.1 previous diff --git a/Semver.Test/FrameworkCharacterizationTests.cs b/Semver.Test/FrameworkCharacterizationTests.cs index 4ffaa99..04c59cc 100644 --- a/Semver.Test/FrameworkCharacterizationTests.cs +++ b/Semver.Test/FrameworkCharacterizationTests.cs @@ -1,7 +1,6 @@ using System; using System.Globalization; using Xunit; -using static System.Environment; namespace Semver.Test { @@ -24,7 +23,8 @@ public void IntTryParseOfInvalidNumberStyleThrowsArgumentException() var ex = Assert.Throws( () => int.TryParse("45", InvalidNumberStyle, CultureInfo.InvariantCulture, out _)); - Assert.Equal(InvalidNumberStyleMessage, ex.Message); + Assert.StartsWith(InvalidNumberStyleMessageStart, ex.Message); + Assert.Equal("style", ex.ParamName); } [Fact] @@ -33,7 +33,8 @@ public void IntParseOfNullAndInvalidNumberStyleThrowsInvalidNumberStyleArgumentE var ex = Assert.Throws( () => int.Parse(null, InvalidNumberStyle, CultureInfo.InvariantCulture)); - Assert.Equal(InvalidNumberStyleMessage, ex.Message); + Assert.StartsWith(InvalidNumberStyleMessageStart, ex.Message); + Assert.Equal("style", ex.ParamName); } [Fact] @@ -54,7 +55,7 @@ public void IntParseOverflow() Assert.Equal(IntOverflowMessage, ex.Message); } - private static readonly string InvalidNumberStyleMessage = $"An undefined NumberStyles value is being used.{NewLine}Parameter name: style"; + private const string InvalidNumberStyleMessageStart = "An undefined NumberStyles value is being used."; private const string InvalidFormatMessage = "Input string was not in a correct format."; private const string IntOverflowMessage = "Value was either too large or too small for an Int32."; private const NumberStyles InvalidNumberStyle = (NumberStyles)int.MaxValue; diff --git a/Semver.Test/PrereleaseIdentifierTests.cs b/Semver.Test/PrereleaseIdentifierTests.cs index e81189a..763e821 100644 --- a/Semver.Test/PrereleaseIdentifierTests.cs +++ b/Semver.Test/PrereleaseIdentifierTests.cs @@ -1,7 +1,6 @@ using System; using System.Globalization; using Xunit; -using static System.Environment; namespace Semver.Test { @@ -54,7 +53,7 @@ public void ConstructWithEmptyString(bool allowLeadingZeros) var ex = Assert.Throws(() => new PrereleaseIdentifier("", allowLeadingZeros)); Assert.Equal("value", ex.ParamName); - Assert.Equal($"Cannot be empty string.{NewLine}Parameter name: value", ex.Message); + Assert.StartsWith($"Cannot be empty string.", ex.Message); } [Theory] @@ -92,7 +91,7 @@ public void ConstructWithStringThrowsExceptionForLeadingZero(string value) var ex = Assert.Throws(() => new PrereleaseIdentifier(value)); Assert.Equal("value", ex.ParamName); - Assert.Equal($"Leading zeros are not allowed on numeric prerelease identifiers '{value}'.{NewLine}Parameter name: value", + Assert.StartsWith($"Leading zeros are not allowed on numeric prerelease identifiers '{value}'.", ex.Message); } @@ -108,7 +107,7 @@ public void ConstructWithStringWithInvalidCharacters(string value) var ex = Assert.Throws(() => new PrereleaseIdentifier(value)); Assert.Equal("value", ex.ParamName); - Assert.Equal($"A prerelease identifier can contain only ASCII alphanumeric characters and hyphens '{value}'.{NewLine}Parameter name: value", + Assert.StartsWith($"A prerelease identifier can contain only ASCII alphanumeric characters and hyphens '{value}'.", ex.Message); } @@ -132,7 +131,7 @@ public void ConstructWithNegativeInt(int value) var ex = Assert.Throws(() => new PrereleaseIdentifier(value)); Assert.Equal("value", ex.ParamName); - Assert.Equal($"Numeric prerelease identifiers can't be negative: {value}.{NewLine}Parameter name: value", + Assert.StartsWith($"Numeric prerelease identifiers can't be negative: {value}.", ex.Message); } diff --git a/Semver.Test/SemVersionObsoleteParsingTests.cs b/Semver.Test/SemVersionObsoleteParsingTests.cs index d9576fe..0367a1d 100644 --- a/Semver.Test/SemVersionObsoleteParsingTests.cs +++ b/Semver.Test/SemVersionObsoleteParsingTests.cs @@ -1,7 +1,6 @@ using System; using System.Text; using Xunit; -using static System.Environment; namespace Semver.Test { @@ -351,7 +350,8 @@ public void ParseLooseValidTest(string versionString, int major, int minor, int public void ParseLooseInvalidThrowsArgumentExceptionTest(string versionString) { var ex = Assert.Throws(() => SemVersion.Parse(versionString)); - Assert.Equal($"Invalid version '{versionString}'.{NewLine}Parameter name: version", ex.Message); + Assert.StartsWith($"Invalid version '{versionString}'.", ex.Message); + Assert.Equal("version", ex.ParamName); } [Theory] @@ -366,8 +366,9 @@ public void ParseLooseInvalidThrowsOverflowExceptionTest(string versionString) public void ParseLooseNullTest() { var ex = Assert.Throws(() => SemVersion.Parse(null)); + Assert.StartsWith("Value cannot be null.", ex.Message); // TODO that is a strange error message, should be version - Assert.Equal($"Value cannot be null.{NewLine}Parameter name: input", ex.Message); + Assert.Equal("input", ex.ParamName); } [Fact] @@ -421,7 +422,8 @@ public void ParseStrictInvalidThrowsArgumentExceptionTest(string versionString) #pragma warning disable CS0618 // Type or member is obsolete var ex = Assert.Throws(() => SemVersion.Parse(versionString, true)); #pragma warning restore CS0618 // Type or member is obsolete - Assert.Equal($"Invalid version '{versionString}'.{NewLine}Parameter name: version", ex.Message); + Assert.StartsWith($"Invalid version '{versionString}'.", ex.Message); + Assert.Equal("version", ex.ParamName); } [Theory] @@ -460,8 +462,9 @@ public void ParseStrictNullTest() #pragma warning disable CS0618 // Type or member is obsolete var ex = Assert.Throws(() => SemVersion.Parse(null, true)); #pragma warning restore CS0618 // Type or member is obsolete + Assert.StartsWith("Value cannot be null.", ex.Message); // TODO that is a strange error message, should be version - Assert.Equal($"Value cannot be null.{NewLine}Parameter name: input", ex.Message); + Assert.Equal("input", ex.ParamName); } [Theory] @@ -584,7 +587,8 @@ public void ImplicitConversionFromInvalidStringThrowsArgumentExceptionTest(strin SemVersion _ = versionString; #pragma warning restore CS0618 // Type or member is obsolete }); - Assert.Equal($"Invalid version '{versionString}'.{NewLine}Parameter name: version", ex.Message); + Assert.StartsWith($"Invalid version '{versionString}'.", ex.Message); + Assert.Equal("version", ex.ParamName); } [Theory] @@ -610,8 +614,9 @@ public void ImplicitConversionFromNullStringTest() SemVersion _ = default(string); #pragma warning restore CS0618 // Type or member is obsolete }); + Assert.StartsWith("Value cannot be null.", ex.Message); // TODO that is a strange error message, should be version - Assert.Equal($"Value cannot be null.{NewLine}Parameter name: input", ex.Message); + Assert.Equal("input", ex.ParamName); } #endregion diff --git a/Semver.Test/SemVersionParsingTests.cs b/Semver.Test/SemVersionParsingTests.cs index 7fbf404..00e5ca0 100644 --- a/Semver.Test/SemVersionParsingTests.cs +++ b/Semver.Test/SemVersionParsingTests.cs @@ -5,7 +5,6 @@ using System.Text; using Semver.Test.Builders; using Xunit; -using static System.Environment; using static Semver.SemVersionStyles; namespace Semver.Test @@ -15,7 +14,7 @@ namespace Semver.Test /// public class SemVersionParsingTests { - private static readonly string InvalidSemVersionStylesMessage = $"An invalid SemVersionStyles value was used.{NewLine}Parameter name: style"; + private static readonly string InvalidSemVersionStylesMessageStart = $"An invalid SemVersionStyles value was used."; private const string LeadingWhitespaceMessage = "Version '{0}' has leading whitespace."; private const string TrailingWhitespaceMessage = "Version '{0}' has trailing whitespace."; @@ -323,7 +322,7 @@ public class SemVersionParsingTests ValidLongVersion(1445670), ValidLongVersion(5646), - Invalid(null, $"Value cannot be null.{NewLine}Parameter name: version")); + Invalid(null, "Value cannot be null.")); [Fact] public void CanConstructParsingTestCases() @@ -349,7 +348,8 @@ public void ParseWithInvalidStyle(SemVersionStyles styles) { var ex = Assert.Throws(() => SemVersion.Parse("ignored", styles)); - Assert.Equal(InvalidSemVersionStylesMessage, ex.Message); + Assert.StartsWith(InvalidSemVersionStylesMessageStart, ex.Message); + Assert.Equal("style", ex.ParamName); } [Theory] @@ -369,9 +369,16 @@ public void ParseWithStyleParsesCorrectly(ParsingTestCase testCase) var ex = Assert.Throws(testCase.ExceptionType, () => SemVersion.Parse(testCase.Version, testCase.Styles, testCase.MaxLength)); - Assert.Equal(string.Format(CultureInfo.InvariantCulture, - testCase.ExceptionMessageFormat, LimitLength(testCase.Version)), - ex.Message); + var expected = string.Format(CultureInfo.InvariantCulture, + testCase.ExceptionMessageFormat, LimitLength(testCase.Version)); + + if (ex is ArgumentException argumentException) + { + Assert.StartsWith(expected, argumentException.Message); + Assert.Equal("version", argumentException.ParamName); + } + else + Assert.Equal(expected, ex.Message); } } @@ -381,7 +388,8 @@ public void TryParseWithInvalidStyle(SemVersionStyles styles) { var ex = Assert.Throws(() => SemVersion.TryParse("ignored", styles, out _)); - Assert.Equal(InvalidSemVersionStylesMessage, ex.Message); + Assert.StartsWith(InvalidSemVersionStylesMessageStart, ex.Message); + Assert.Equal("style", ex.ParamName); } [Theory] diff --git a/Semver.Test/SemVersionTests.cs b/Semver.Test/SemVersionTests.cs index 83ec443..ccff9b9 100644 --- a/Semver.Test/SemVersionTests.cs +++ b/Semver.Test/SemVersionTests.cs @@ -6,7 +6,6 @@ using System.Runtime.Serialization.Formatters.Binary; #endif using Xunit; -using static System.Environment; namespace Semver.Test { @@ -252,7 +251,8 @@ public void ConstructSemVersionFromNullSystemVersionTest() var ex = Assert.Throws(() => new SemVersion(null)); #pragma warning restore 618 - Assert.Equal($"Value cannot be null.{NewLine}Parameter name: version", ex.Message); + Assert.StartsWith("Value cannot be null.", ex.Message); + Assert.Equal("version", ex.ParamName); } [Theory] @@ -285,7 +285,8 @@ public void FromVersionWithPositiveRevisionTest(int major, int minor, int build, var ex = Assert.Throws(() => SemVersion.FromVersion(nonSemanticVersion)); - Assert.Equal($"Version with Revision number can't be converted to SemVer.{NewLine}Parameter name: version", ex.Message); + Assert.StartsWith("Version with Revision number can't be converted to SemVer.", ex.Message); + Assert.Equal("version", ex.ParamName); } [Theory] @@ -333,7 +334,8 @@ public void FromVersionNullTest() { var ex = Assert.Throws(() => SemVersion.FromVersion(null)); - Assert.Equal($"Value cannot be null.{NewLine}Parameter name: version", ex.Message); + Assert.StartsWith("Value cannot be null.", ex.Message); + Assert.Equal("version", ex.ParamName); } [Theory] diff --git a/Semver.Test/Semver.Test.csproj b/Semver.Test/Semver.Test.csproj index e2f9f79..efd42b7 100644 --- a/Semver.Test/Semver.Test.csproj +++ b/Semver.Test/Semver.Test.csproj @@ -1,7 +1,7 @@  - netcoreapp2.1;net452 + netcoreapp2.1;netcoreapp3.1;net452 false true portable @@ -28,11 +28,11 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + @@ -42,18 +42,4 @@ - - $(DefineConstants);NETSTANDARD - - - - $(DefineConstants);NET46 - - - - - - - - diff --git a/Semver/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt b/Semver/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt new file mode 100644 index 0000000..5f28270 --- /dev/null +++ b/Semver/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Semver/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt b/Semver/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt new file mode 100644 index 0000000..0161aba --- /dev/null +++ b/Semver/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt @@ -0,0 +1,68 @@ +override Semver.SemVersion.Equals(object obj) -> bool +override Semver.SemVersion.GetHashCode() -> int +override Semver.SemVersion.ToString() -> string +Semver.SemVersion +Semver.SemVersion.Build.get -> string +Semver.SemVersion.Change(int? major = null, int? minor = null, int? patch = null, string prerelease = null, string build = null) -> Semver.SemVersion +Semver.SemVersion.CompareByPrecedence(Semver.SemVersion other) -> int +Semver.SemVersion.CompareTo(object obj) -> int +Semver.SemVersion.CompareTo(Semver.SemVersion other) -> int +Semver.SemVersion.GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) -> void +Semver.SemVersion.Major.get -> int +Semver.SemVersion.Minor.get -> int +Semver.SemVersion.Patch.get -> int +Semver.SemVersion.PrecedenceMatches(Semver.SemVersion other) -> bool +Semver.SemVersion.Prerelease.get -> string +Semver.SemVersion.SemVersion(int major, int minor = 0, int patch = 0, string prerelease = "", string build = "") -> void +Semver.SemVersion.SemVersion(System.Version version) -> void +static Semver.SemVersion.Compare(Semver.SemVersion versionA, Semver.SemVersion versionB) -> int +static Semver.SemVersion.Equals(Semver.SemVersion versionA, Semver.SemVersion versionB) -> bool +static Semver.SemVersion.implicit operator Semver.SemVersion(string version) -> Semver.SemVersion +static Semver.SemVersion.operator !=(Semver.SemVersion left, Semver.SemVersion right) -> bool +static Semver.SemVersion.operator <(Semver.SemVersion left, Semver.SemVersion right) -> bool +static Semver.SemVersion.operator <=(Semver.SemVersion left, Semver.SemVersion right) -> bool +static Semver.SemVersion.operator ==(Semver.SemVersion left, Semver.SemVersion right) -> bool +static Semver.SemVersion.operator >(Semver.SemVersion left, Semver.SemVersion right) -> bool +static Semver.SemVersion.operator >=(Semver.SemVersion left, Semver.SemVersion right) -> bool +static Semver.SemVersion.Parse(string version, bool strict = false) -> Semver.SemVersion +static Semver.SemVersion.TryParse(string version, out Semver.SemVersion semver, bool strict = false) -> bool +override Semver.PrereleaseIdentifier.Equals(object obj) -> bool +override Semver.PrereleaseIdentifier.GetHashCode() -> int +override Semver.PrereleaseIdentifier.ToString() -> string +Semver.PrereleaseIdentifier +Semver.PrereleaseIdentifier.Equals(Semver.PrereleaseIdentifier other) -> bool +Semver.PrereleaseIdentifier.IntValue.get -> int? +Semver.PrereleaseIdentifier.PrereleaseIdentifier() -> void +Semver.PrereleaseIdentifier.PrereleaseIdentifier(int value) -> void +Semver.PrereleaseIdentifier.PrereleaseIdentifier(string value, bool allowLeadingZeros = false) -> void +Semver.PrereleaseIdentifier.Value.get -> string +Semver.SemVersion.Equals(Semver.SemVersion other) -> bool +Semver.SemVersion.IsPrerelease.get -> bool +Semver.SemVersion.Metadata.get -> string +Semver.SemVersion.MetadataIdentifiers.get -> System.Collections.Generic.IReadOnlyList +Semver.SemVersion.PrereleaseIdentifiers.get -> System.Collections.Generic.IReadOnlyList +Semver.SemVersion.ToVersion() -> System.Version +Semver.SemVersionStyles +Semver.SemVersionStyles.AllowLeadingWhitespace = 2 -> Semver.SemVersionStyles +Semver.SemVersionStyles.AllowLeadingZeros = 1 -> Semver.SemVersionStyles +Semver.SemVersionStyles.AllowLowerV = 8 -> Semver.SemVersionStyles +Semver.SemVersionStyles.AllowTrailingWhitespace = 4 -> Semver.SemVersionStyles +Semver.SemVersionStyles.AllowUpperV = 16 -> Semver.SemVersionStyles +Semver.SemVersionStyles.AllowV = Semver.SemVersionStyles.AllowLowerV | Semver.SemVersionStyles.AllowUpperV -> Semver.SemVersionStyles +Semver.SemVersionStyles.AllowWhitespace = Semver.SemVersionStyles.AllowLeadingWhitespace | Semver.SemVersionStyles.AllowTrailingWhitespace -> Semver.SemVersionStyles +Semver.SemVersionStyles.Any = -1 -> Semver.SemVersionStyles +Semver.SemVersionStyles.OptionalMinorPatch = 96 -> Semver.SemVersionStyles +Semver.SemVersionStyles.OptionalPatch = 32 -> Semver.SemVersionStyles +Semver.SemVersionStyles.Strict = 0 -> Semver.SemVersionStyles +static Semver.PrereleaseIdentifier.implicit operator string(Semver.PrereleaseIdentifier prereleaseIdentifier) -> string +static Semver.PrereleaseIdentifier.operator !=(Semver.PrereleaseIdentifier left, Semver.PrereleaseIdentifier right) -> bool +static Semver.PrereleaseIdentifier.operator ==(Semver.PrereleaseIdentifier left, Semver.PrereleaseIdentifier right) -> bool +static Semver.SemVersion.FromVersion(System.Version version) -> Semver.SemVersion +static Semver.SemVersion.Parse(string version) -> Semver.SemVersion +static Semver.SemVersion.Parse(string version, bool strict) -> Semver.SemVersion +static Semver.SemVersion.Parse(string version, Semver.SemVersionStyles style, int maxLength = 1024) -> Semver.SemVersion +static Semver.SemVersion.TryParse(string version, out Semver.SemVersion semver) -> bool +static Semver.SemVersion.TryParse(string version, out Semver.SemVersion semver, bool strict) -> bool +static Semver.SemVersion.TryParse(string version, Semver.SemVersionStyles style, out Semver.SemVersion semver, int maxLength = 1024) -> bool +*REMOVED*static Semver.SemVersion.Parse(string version, bool strict = false) -> Semver.SemVersion +*REMOVED*static Semver.SemVersion.TryParse(string version, out Semver.SemVersion semver, bool strict = false) -> bool \ No newline at end of file diff --git a/Semver/SemVersion.cs b/Semver/SemVersion.cs index d00fa1c..9b18cb8 100644 --- a/Semver/SemVersion.cs +++ b/Semver/SemVersion.cs @@ -5,7 +5,7 @@ using System.Globalization; using System.Linq; using System.Text; -#if !NETSTANDARD +#if SERIALIZABLE using System.Runtime.Serialization; using System.Security.Permissions; #endif @@ -17,11 +17,11 @@ namespace Semver /// A semantic version number. /// Conforms with v2.0.0 of semantic versioning (http://semver.org). /// -#if NETSTANDARD - public sealed class SemVersion : IComparable, IComparable, IEquatable -#else +#if SERIALIZABLE [Serializable] public sealed class SemVersion : IComparable, IComparable, IEquatable, ISerializable +#else + public sealed class SemVersion : IComparable, IComparable, IEquatable #endif { private const string InvalidSemVersionStylesMessage = "An invalid SemVersionStyles value was used."; @@ -41,14 +41,14 @@ public sealed class SemVersion : IComparable, IComparable, IEquatabl @"(?>\.(?\d+))?" + @"(?>\-(?
[0-9A-Za-z\-\.]+))?" +
                 @"(?>\+(?[0-9A-Za-z\-\.]+))?$",
-#if NETSTANDARD
-                RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture,
-#else
+#if COMPILED_REGEX
                 RegexOptions.CultureInvariant | RegexOptions.Compiled | RegexOptions.ExplicitCapture,
+#else
+                RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture,
 #endif
                 TimeSpan.FromSeconds(0.5));
 
-#if !NETSTANDARD
+#if SERIALIZABLE
         /// 
         /// Deserialize a .
         /// 
@@ -668,7 +668,7 @@ public override int GetHashCode()
             return hashCode;
         }
 
-#if !NETSTANDARD
+#if SERIALIZABLE
         /// 
         /// Populates a  with the data needed to serialize the target object.
         /// 
diff --git a/Semver/Semver.csproj b/Semver/Semver.csproj
index 66e589c..197075b 100644
--- a/Semver/Semver.csproj
+++ b/Semver/Semver.csproj
@@ -5,7 +5,7 @@
     Copyright © 2013 Max Hauser, Jeff Walker
     Semantic versioning
     Max Hauser, Jeff Walker
-    netstandard1.1;net452
+    netstandard1.1;netstandard2.0;net452
     $(NoWarn);CS1591;CA1303
     true
     portable
@@ -26,20 +26,16 @@
     0.0.0.0
   
 
-  
-    $(DefineConstants);NETSTANDARD;NETSTANDARD1_1
-  
-
-  
-    $(DefineConstants);NET45
+  
+    $(DefineConstants);SERIALIZABLE;COMPILED_REGEX
   
 
   
-    
+    
       all
       runtime; build; native; contentfiles; analyzers; buildtransitive
     
-    
+    
       all
       runtime; build; native; contentfiles; analyzers; buildtransitive