我遇到了一个有趣的情况,当NRE
方法应该返回Uri.TryCreate
时,我会从false
获得{。}}。
您可以重现以下问题:
Uri url;
if (Uri.TryCreate("http:Ç", UriKind.RelativeOrAbsolute, out url))
{
Console.WriteLine("success");
}
我猜它在解析过程中失败了,但是当我尝试"http:A"
时,它返回true
并将其解析为相对url。即使解析失败,我应该按照我的理解返回false
,这可能是什么问题?这似乎是实现中的错误原因文档没有提到有关此方法的任何异常。
错误发生在.NET 4.6.1中,而不是4.0
答案 0 :(得分:6)
这是.NET框架中的一个错误。您可以在MicrosoftConnect上打开票证。
此方法将引发异常
void Systen.Uri.CreateUriInfo(System.Uri.Flags cF)
在第2290行(检查reference source)执行以下声明:
// This is NOT an ImplicitFile uri
idx = (ushort)m_Syntax.SchemeName.Length;
此时,m_Syntax
对象将为null
,因为在解析过程中,它将被丢弃。
方法
void InitializeUri(ParsingError err, UriKind uriKind, out UriFormatException e)
if (m_Syntax.IsSimple)
{
if ((err = PrivateParseMinimal()) != ParsingError.None)
{
if (uriKind != UriKind.Absolute && err <= ParsingError.LastRelativeUriOkErrIndex)
{
// RFC 3986 Section 5.4.2 - http:(relativeUri) may be considered a valid relative Uri.
m_Syntax = null; // convert to relative uri
e = null;
m_Flags &= Flags.UserEscaped; // the only flag that makes sense for a relative uri
}
// ...
}
// ...
}
PrivateParseMinimal()
方法会根据您的规范返回ParsingError.BadAuthority
和uriKind == UriKind.RelativeOrAbsolute
。
PrivateParseMinimal()
方法查找以下任何字符序列:&#34; //&#34;,&#34; \&#34;,&#34; / \&#34; ,&#34; /&#34;。由于输入字符串中没有此类序列,因此将返回ParsingError.BadAuthority
代码。