diff --git a/src/Umbraco.Core/UdiParser.cs b/src/Umbraco.Core/UdiParser.cs index 30448e1b45..1442d43eb2 100644 --- a/src/Umbraco.Core/UdiParser.cs +++ b/src/Umbraco.Core/UdiParser.cs @@ -70,13 +70,13 @@ public sealed class UdiParser /// The string to convert. /// An Udi instance that contains the value that was parsed. /// A boolean value indicating whether the string could be parsed. - public static bool TryParse(string? s, [MaybeNullWhen(false)] out T udi) - where T : Udi? + public static bool TryParse(string? s, [NotNullWhen(true)] out T? udi) + where T : Udi { var result = ParseInternal(s, true, false, out Udi? parsed); - if (result && parsed is T) + if (result && parsed is T t) { - udi = (T)parsed; + udi = t; return true; } diff --git a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/CoreThings/UdiTests.cs b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/CoreThings/UdiTests.cs index 98bf4a608c..ccca8f9f3c 100644 --- a/tests/Umbraco.Tests.UnitTests/Umbraco.Core/CoreThings/UdiTests.cs +++ b/tests/Umbraco.Tests.UnitTests/Umbraco.Core/CoreThings/UdiTests.cs @@ -205,6 +205,28 @@ public class UdiTests Assert.Throws(() => new UdiRange(guidUdi, "x")); } + [Test] + public void TryParseTest() + { + // try parse to "Udi" + var stringUdiString = "umb://document/b9a56165-6c4e-4e79-8277-620430174ad3"; + Assert.IsTrue(UdiParser.TryParse(stringUdiString, out Udi udi1)); + Assert.AreEqual("b9a56165-6c4e-4e79-8277-620430174ad3", udi1 is GuidUdi guidUdi1 ? guidUdi1.Guid.ToString() : string.Empty); + + // try parse to "Udi" + Assert.IsFalse(UdiParser.TryParse("nope", out Udi udi2)); + Assert.IsNull(udi2); + + // try parse to "GuidUdi?" + Assert.IsTrue(UdiParser.TryParse(stringUdiString, out GuidUdi? guidUdi3)); + Assert.AreEqual("b9a56165-6c4e-4e79-8277-620430174ad3", guidUdi3.Guid.ToString()); + + // try parse to "GuidUdi?" + Assert.IsFalse(UdiParser.TryParse("nope", out GuidUdi? guidUdi4)); + Assert.IsNull(guidUdi4); + + } + [Test] public void SerializationTest() {