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()
{