Turn on nullability for Routing (#24238)

* Turn on nullability for Routing

We previously only had annotations enabled which resulted in incorrect nullability. This change enables
nullability.

Fixes https://github.com/dotnet/aspnetcore/issues/24042
This commit is contained in:
Pranav K 2020-07-25 07:34:05 -07:00 committed by GitHub
parent 64b5ea9393
commit f26942805d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
100 changed files with 344 additions and 287 deletions

View File

@ -20,8 +20,8 @@ namespace Microsoft.AspNetCore.Http
/// </param>
public Endpoint(
RequestDelegate requestDelegate,
EndpointMetadataCollection metadata,
string displayName)
EndpointMetadataCollection? metadata,
string? displayName)
{
// All are allowed to be null
RequestDelegate = requestDelegate;
@ -32,7 +32,7 @@ namespace Microsoft.AspNetCore.Http
/// <summary>
/// Gets the informational display name of this endpoint.
/// </summary>
public string DisplayName { get; }
public string? DisplayName { get; }
/// <summary>
/// Gets the collection of metadata associated with this endpoint.

View File

@ -25,7 +25,7 @@ namespace Microsoft.AspNetCore.Routing
/// <returns><c>true</c> if the URL parameter contains a valid value; otherwise, <c>false</c>.</returns>
bool Match(
HttpContext? httpContext,
IRouter route,
IRouter? route,
string routeKey,
RouteValueDictionary values,
RouteDirection routeDirection);

View File

@ -6,6 +6,7 @@
//
// See https://github.com/dotnet/corefx/blob/143df51926f2ad397fef9c9ca7ede88e2721e801/src/Common/src/System/Collections/Generic/ArrayBuilder.cs
#nullable disable
using System;
using System.Diagnostics;

View File

@ -128,7 +128,7 @@ namespace Microsoft.AspNetCore.Builder
}
// If someone messes with this, just let it crash.
endpointRouteBuilder = (DefaultEndpointRouteBuilder)obj;
endpointRouteBuilder = (DefaultEndpointRouteBuilder)obj!;
// This check handles the case where Map or something else that forks the pipeline is called between the two
// routing middleware.

View File

@ -1,4 +1,4 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
@ -6,6 +6,7 @@ using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Text;
using System.Threading;
@ -21,8 +22,8 @@ namespace Microsoft.AspNetCore.Routing
public sealed class CompositeEndpointDataSource : EndpointDataSource
{
private readonly object _lock;
private readonly ICollection<EndpointDataSource> _dataSources;
private IReadOnlyList<Endpoint> _endpoints;
private readonly ICollection<EndpointDataSource> _dataSources = default!;
private IReadOnlyList<Endpoint> _endpoints = default!;
private IChangeToken _consumerChangeToken;
private CancellationTokenSource _cts;
@ -49,7 +50,7 @@ namespace Microsoft.AspNetCore.Routing
}
}
private void OnDataSourcesChanged(object sender, NotifyCollectionChangedEventArgs e)
private void OnDataSourcesChanged(object? sender, NotifyCollectionChangedEventArgs e)
{
lock (_lock)
{
@ -140,6 +141,7 @@ namespace Microsoft.AspNetCore.Routing
}
}
[MemberNotNull(nameof(_cts), nameof(_consumerChangeToken))]
private void CreateChangeToken()
{
_cts = new CancellationTokenSource();
@ -198,7 +200,7 @@ namespace Microsoft.AspNetCore.Routing
}
return sb.ToString();
IEnumerable<string> FormatValues(IEnumerable<KeyValuePair<string, object>> values)
IEnumerable<string> FormatValues(IEnumerable<KeyValuePair<string, object?>> values)
{
return values.Select(
kvp =>

View File

@ -14,8 +14,8 @@ namespace Microsoft.AspNetCore.Routing.Constraints
{
/// <inheritdoc />
public bool Match(
HttpContext httpContext,
IRouter route,
HttpContext? httpContext,
IRouter? route,
string routeKey,
RouteValueDictionary values,
RouteDirection routeDirection)
@ -44,4 +44,4 @@ namespace Microsoft.AspNetCore.Routing.Constraints
return false;
}
}
}
}

View File

@ -33,8 +33,8 @@ namespace Microsoft.AspNetCore.Routing.Constraints
/// <inheritdoc />
public bool Match(
HttpContext httpContext,
IRouter route,
HttpContext? httpContext,
IRouter? route,
string routeKey,
RouteValueDictionary values,
RouteDirection routeDirection)
@ -60,4 +60,4 @@ namespace Microsoft.AspNetCore.Routing.Constraints
return true;
}
}
}
}

View File

@ -20,8 +20,8 @@ namespace Microsoft.AspNetCore.Routing.Constraints
{
/// <inheritdoc />
public bool Match(
HttpContext httpContext,
IRouter route,
HttpContext? httpContext,
IRouter? route,
string routeKey,
RouteValueDictionary values,
RouteDirection routeDirection)
@ -50,4 +50,4 @@ namespace Microsoft.AspNetCore.Routing.Constraints
return false;
}
}
}
}

View File

@ -14,8 +14,8 @@ namespace Microsoft.AspNetCore.Routing.Constraints
{
/// <inheritdoc />
public bool Match(
HttpContext httpContext,
IRouter route,
HttpContext? httpContext,
IRouter? route,
string routeKey,
RouteValueDictionary values,
RouteDirection routeDirection)
@ -44,4 +44,4 @@ namespace Microsoft.AspNetCore.Routing.Constraints
return false;
}
}
}
}

View File

@ -14,8 +14,8 @@ namespace Microsoft.AspNetCore.Routing.Constraints
{
/// <inheritdoc />
public bool Match(
HttpContext httpContext,
IRouter route,
HttpContext? httpContext,
IRouter? route,
string routeKey,
RouteValueDictionary values,
RouteDirection routeDirection)
@ -48,4 +48,4 @@ namespace Microsoft.AspNetCore.Routing.Constraints
return false;
}
}
}
}

View File

@ -85,8 +85,8 @@ namespace Microsoft.AspNetCore.Routing.Constraints
{
/// <inheritdoc />
public bool Match(
HttpContext httpContext,
IRouter route,
HttpContext? httpContext,
IRouter? route,
string routeKey,
RouteValueDictionary values,
RouteDirection routeDirection)

View File

@ -14,8 +14,8 @@ namespace Microsoft.AspNetCore.Routing.Constraints
{
/// <inheritdoc />
public bool Match(
HttpContext httpContext,
IRouter route,
HttpContext? httpContext,
IRouter? route,
string routeKey,
RouteValueDictionary values,
RouteDirection routeDirection)
@ -48,4 +48,4 @@ namespace Microsoft.AspNetCore.Routing.Constraints
return false;
}
}
}
}

View File

@ -16,8 +16,8 @@ namespace Microsoft.AspNetCore.Routing.Constraints
{
/// <inheritdoc />
public bool Match(
HttpContext httpContext,
IRouter route,
HttpContext? httpContext,
IRouter? route,
string routeKey,
RouteValueDictionary values,
RouteDirection routeDirection)
@ -46,4 +46,4 @@ namespace Microsoft.AspNetCore.Routing.Constraints
return false;
}
}
}
}

View File

@ -35,8 +35,8 @@ namespace Microsoft.AspNetCore.Routing.Constraints
/// <inheritdoc />
public virtual bool Match(
HttpContext httpContext,
IRouter route,
HttpContext? httpContext,
IRouter? route,
string routeKey,
RouteValueDictionary values,
RouteDirection routeDirection)

View File

@ -14,8 +14,8 @@ namespace Microsoft.AspNetCore.Routing.Constraints
{
/// <inheritdoc />
public bool Match(
HttpContext httpContext,
IRouter route,
HttpContext? httpContext,
IRouter? route,
string routeKey,
RouteValueDictionary values,
RouteDirection routeDirection)
@ -44,4 +44,4 @@ namespace Microsoft.AspNetCore.Routing.Constraints
return false;
}
}
}
}

View File

@ -71,8 +71,8 @@ namespace Microsoft.AspNetCore.Routing.Constraints
/// <inheritdoc />
public bool Match(
HttpContext httpContext,
IRouter route,
HttpContext? httpContext,
IRouter? route,
string routeKey,
RouteValueDictionary values,
RouteDirection routeDirection)
@ -89,7 +89,7 @@ namespace Microsoft.AspNetCore.Routing.Constraints
if (values.TryGetValue(routeKey, out var value) && value != null)
{
var valueString = Convert.ToString(value, CultureInfo.InvariantCulture);
var valueString = Convert.ToString(value, CultureInfo.InvariantCulture)!;
var length = valueString.Length;
return length >= MinLength && length <= MaxLength;
}
@ -97,4 +97,4 @@ namespace Microsoft.AspNetCore.Routing.Constraints
return false;
}
}
}
}

View File

@ -14,8 +14,8 @@ namespace Microsoft.AspNetCore.Routing.Constraints
{
/// <inheritdoc />
public bool Match(
HttpContext httpContext,
IRouter route,
HttpContext? httpContext,
IRouter? route,
string routeKey,
RouteValueDictionary values,
RouteDirection routeDirection)
@ -44,4 +44,4 @@ namespace Microsoft.AspNetCore.Routing.Constraints
return false;
}
}
}
}

View File

@ -34,8 +34,8 @@ namespace Microsoft.AspNetCore.Routing.Constraints
/// <inheritdoc />
public bool Match(
HttpContext httpContext,
IRouter route,
HttpContext? httpContext,
IRouter? route,
string routeKey,
RouteValueDictionary values,
RouteDirection routeDirection)
@ -52,11 +52,11 @@ namespace Microsoft.AspNetCore.Routing.Constraints
if (values.TryGetValue(routeKey, out var value) && value != null)
{
var valueString = Convert.ToString(value, CultureInfo.InvariantCulture);
var valueString = Convert.ToString(value, CultureInfo.InvariantCulture)!;
return valueString.Length <= MaxLength;
}
return false;
}
}
}
}

View File

@ -28,8 +28,8 @@ namespace Microsoft.AspNetCore.Routing.Constraints
/// <inheritdoc />
public bool Match(
HttpContext httpContext,
IRouter route,
HttpContext? httpContext,
IRouter? route,
string routeKey,
RouteValueDictionary values,
RouteDirection routeDirection)
@ -56,4 +56,4 @@ namespace Microsoft.AspNetCore.Routing.Constraints
return false;
}
}
}
}

View File

@ -34,8 +34,8 @@ namespace Microsoft.AspNetCore.Routing.Constraints
/// <inheritdoc />
public bool Match(
HttpContext httpContext,
IRouter route,
HttpContext? httpContext,
IRouter? route,
string routeKey,
RouteValueDictionary values,
RouteDirection routeDirection)
@ -52,11 +52,11 @@ namespace Microsoft.AspNetCore.Routing.Constraints
if (values.TryGetValue(routeKey, out var value) && value != null)
{
var valueString = Convert.ToString(value, CultureInfo.InvariantCulture);
var valueString = Convert.ToString(value, CultureInfo.InvariantCulture)!;
return valueString.Length >= MinLength;
}
return false;
}
}
}
}

View File

@ -28,8 +28,8 @@ namespace Microsoft.AspNetCore.Routing.Constraints
/// <inheritdoc />
public bool Match(
HttpContext httpContext,
IRouter route,
HttpContext? httpContext,
IRouter? route,
string routeKey,
RouteValueDictionary values,
RouteDirection routeDirection)
@ -56,4 +56,4 @@ namespace Microsoft.AspNetCore.Routing.Constraints
return false;
}
}
}
}

View File

@ -81,8 +81,8 @@ namespace Microsoft.AspNetCore.Routing.Constraints
{
/// <inheritdoc />
public bool Match(
HttpContext httpContext,
IRouter route,
HttpContext? httpContext,
IRouter? route,
string routeKey,
RouteValueDictionary values,
RouteDirection routeDirection)

View File

@ -1,4 +1,4 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNetCore.Http;
@ -13,7 +13,7 @@ namespace Microsoft.AspNetCore.Routing.Constraints
{
}
public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
public bool Match(HttpContext? httpContext, IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
{
return true;
}

View File

@ -24,8 +24,8 @@ namespace Microsoft.AspNetCore.Routing.Constraints
public IRouteConstraint InnerConstraint { get; }
public bool Match(
HttpContext httpContext,
IRouter route,
HttpContext? httpContext,
IRouter? route,
string routeKey,
RouteValueDictionary values,
RouteDirection routeDirection)
@ -52,4 +52,4 @@ namespace Microsoft.AspNetCore.Routing.Constraints
return true;
}
}
}
}

View File

@ -42,8 +42,8 @@ namespace Microsoft.AspNetCore.Routing.Constraints
/// <inheritdoc />
public bool Match(
HttpContext httpContext,
IRouter route,
HttpContext? httpContext,
IRouter? route,
string routeKey,
RouteValueDictionary values,
RouteDirection routeDirection)
@ -70,4 +70,4 @@ namespace Microsoft.AspNetCore.Routing.Constraints
return false;
}
}
}
}

View File

@ -38,8 +38,8 @@ namespace Microsoft.AspNetCore.Routing.Constraints
public Regex Constraint { get; private set; }
public bool Match(
HttpContext httpContext,
IRouter route,
HttpContext? httpContext,
IRouter? route,
string routeKey,
RouteValueDictionary values,
RouteDirection routeDirection)
@ -57,7 +57,7 @@ namespace Microsoft.AspNetCore.Routing.Constraints
if (values.TryGetValue(routeKey, out var routeValue)
&& routeValue != null)
{
var parameterValueString = Convert.ToString(routeValue, CultureInfo.InvariantCulture);
var parameterValueString = Convert.ToString(routeValue, CultureInfo.InvariantCulture)!;
return Constraint.IsMatch(parameterValueString);
}

View File

@ -18,8 +18,8 @@ namespace Microsoft.AspNetCore.Routing.Constraints
{
/// <inheritdoc />
public bool Match(
HttpContext httpContext,
IRouter route,
HttpContext? httpContext,
IRouter? route,
string routeKey,
RouteValueDictionary values,
RouteDirection routeDirection)
@ -44,4 +44,4 @@ namespace Microsoft.AspNetCore.Routing.Constraints
return false;
}
}
}
}

View File

@ -1,4 +1,4 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
@ -29,7 +29,7 @@ namespace Microsoft.AspNetCore.Routing.Constraints
}
/// <inheritdoc />
public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
public bool Match(HttpContext? httpContext, IRouter? route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
{
if (routeKey == null)
{
@ -44,7 +44,7 @@ namespace Microsoft.AspNetCore.Routing.Constraints
if (values.TryGetValue(routeKey, out var routeValue)
&& routeValue != null)
{
var parameterValueString = Convert.ToString(routeValue, CultureInfo.InvariantCulture);
var parameterValueString = Convert.ToString(routeValue, CultureInfo.InvariantCulture)!;
return parameterValueString.Equals(_value, StringComparison.OrdinalIgnoreCase);
}
@ -52,4 +52,4 @@ namespace Microsoft.AspNetCore.Routing.Constraints
return false;
}
}
}
}

View File

@ -1,6 +1,8 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
#nullable disable
using System;
using System.Collections.Generic;
using System.Threading;

View File

@ -1,6 +1,8 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
#nullable disable
using System.Collections.Generic;
namespace Microsoft.AspNetCore.Routing.DecisionTree
@ -11,4 +13,4 @@ namespace Microsoft.AspNetCore.Routing.DecisionTree
public Dictionary<object, DecisionTreeNode<TItem>> Branches { get; set; }
}
}
}

View File

@ -1,6 +1,8 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
#nullable disable
using System.Collections.Generic;
namespace Microsoft.AspNetCore.Routing.DecisionTree
@ -17,4 +19,4 @@ namespace Microsoft.AspNetCore.Routing.DecisionTree
// matching the input data.
public IList<DecisionCriterion<TItem>> Criteria { get; set; }
}
}
}

View File

@ -1,6 +1,8 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
#nullable disable
using System.Collections.Generic;
namespace Microsoft.AspNetCore.Routing.DecisionTree
@ -13,4 +15,4 @@ namespace Microsoft.AspNetCore.Routing.DecisionTree
public TItem Item { get; set; }
}
}
}

View File

@ -325,7 +325,7 @@ namespace Microsoft.AspNetCore.Routing
}
// Also called from DefaultLinkGenerationTemplate
public static RouteValueDictionary? GetAmbientValues(HttpContext httpContext)
public static RouteValueDictionary? GetAmbientValues(HttpContext? httpContext)
{
return httpContext?.Features.Get<IRouteValuesFeature>()?.RouteValues;
}

View File

@ -4,6 +4,7 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
@ -46,7 +47,7 @@ namespace Microsoft.AspNetCore.Routing
_createMatcher = CreateRoutePatternMatcher;
}
public override RouteValueDictionary ParsePathByAddress<TAddress>(TAddress address, PathString path)
public override RouteValueDictionary? ParsePathByAddress<TAddress>(TAddress address, PathString path)
{
var endpoints = GetEndpoints(address);
if (endpoints.Count == 0)
@ -117,7 +118,7 @@ namespace Microsoft.AspNetCore.Routing
internal MatcherState GetMatcherState(RouteEndpoint endpoint) => _matcherCache.EnsureInitialized().GetOrAdd(endpoint, _createMatcher);
// Internal for testing
internal bool TryParse(RouteEndpoint endpoint, PathString path, out RouteValueDictionary values)
internal bool TryParse(RouteEndpoint endpoint, PathString path, [NotNullWhen(true)] out RouteValueDictionary? values)
{
var (matcher, constraints) = GetMatcherState(endpoint);
@ -168,6 +169,7 @@ namespace Microsoft.AspNetCore.Routing
}
}
#nullable disable
private static class Log
{
public static class EventIds

View File

@ -21,7 +21,7 @@ namespace Microsoft.AspNetCore.Routing
_serviceProvider = serviceProvider;
}
public override IParameterPolicy Create(RoutePatternParameterPart parameter, IParameterPolicy parameterPolicy)
public override IParameterPolicy Create(RoutePatternParameterPart? parameter, IParameterPolicy parameterPolicy)
{
if (parameterPolicy == null)
{
@ -36,7 +36,7 @@ namespace Microsoft.AspNetCore.Routing
return parameterPolicy;
}
public override IParameterPolicy Create(RoutePatternParameterPart parameter, string inlineText)
public override IParameterPolicy Create(RoutePatternParameterPart? parameter, string inlineText)
{
if (inlineText == null)
{

View File

@ -101,6 +101,7 @@ namespace Microsoft.AspNetCore.Routing
"Configure your application startup by adding app.UseCors() inside the call to Configure(..) in the application startup code. The call to app.UseCors() must appear between app.UseRouting() and app.UseEndpoints(...).");
}
#nullable disable
private static class Log
{
private static readonly Action<ILogger, string, Exception> _executingEndpoint = LoggerMessage.Define<string>(

View File

@ -92,7 +92,7 @@ namespace Microsoft.AspNetCore.Routing
throw new InvalidOperationException(builder.ToString());
string GetEndpointName(Endpoint endpoint)
string? GetEndpointName(Endpoint endpoint)
{
if (endpoint.Metadata.GetMetadata<ISuppressLinkGenerationMetadata>()?.SuppressLinkGeneration == true)
{

View File

@ -22,7 +22,7 @@ namespace Microsoft.AspNetCore.Routing
private readonly DiagnosticListener _diagnosticListener;
private readonly RequestDelegate _next;
private Task<Matcher> _initializationTask;
private Task<Matcher>? _initializationTask;
public EndpointRoutingMiddleware(
MatcherFactory matcherFactory,
@ -165,6 +165,7 @@ namespace Microsoft.AspNetCore.Routing
}
}
#nullable disable
private static class Log
{
private static readonly Action<ILogger, string, Exception> _matchSuccess = LoggerMessage.Define<string>(

View File

@ -75,7 +75,7 @@ namespace Microsoft.AspNetCore.Routing
var parseResults = ParseConstraints(routeParameter, currentIndex, endIndex);
currentIndex = parseResults.CurrentIndex;
string defaultValue = null;
string? defaultValue = null;
if (currentIndex <= endIndex &&
routeParameter[currentIndex] == '=')
{

View File

@ -1,4 +1,4 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNetCore.Http;
@ -27,14 +27,14 @@ namespace Microsoft.AspNetCore.Routing
/// names from <c>RouteOptions</c>.
/// </param>
/// <returns>A URI with an absolute path, or <c>null</c>.</returns>
public static string GetPathByName(
public static string? GetPathByName(
this LinkGenerator generator,
HttpContext httpContext,
string endpointName,
object values,
object? values,
PathString? pathBase = default,
FragmentString fragment = default,
LinkOptions options = default)
LinkOptions? options = default)
{
if (generator == null)
{
@ -74,13 +74,13 @@ namespace Microsoft.AspNetCore.Routing
/// names from <c>RouteOptions</c>.
/// </param>
/// <returns>A URI with an absolute path, or <c>null</c>.</returns>
public static string GetPathByName(
public static string? GetPathByName(
this LinkGenerator generator,
string endpointName,
object values,
object? values,
PathString pathBase = default,
FragmentString fragment = default,
LinkOptions options = default)
LinkOptions? options = default)
{
if (generator == null)
{
@ -126,16 +126,16 @@ namespace Microsoft.AspNetCore.Routing
/// your deployment environment.
/// </para>
/// </remarks>
public static string GetUriByName(
public static string? GetUriByName(
this LinkGenerator generator,
HttpContext httpContext,
string endpointName,
object values,
string scheme = default,
object? values,
string? scheme = default,
HostString? host = default,
PathString? pathBase = default,
FragmentString fragment = default,
LinkOptions options = default)
LinkOptions? options = default)
{
if (generator == null)
{
@ -190,15 +190,15 @@ namespace Microsoft.AspNetCore.Routing
/// your deployment environment.
/// </para>
/// </remarks>
public static string GetUriByName(
public static string? GetUriByName(
this LinkGenerator generator,
string endpointName,
object values,
object? values,
string scheme,
HostString host,
PathString pathBase = default,
FragmentString fragment = default,
LinkOptions options = default)
LinkOptions? options = default)
{
if (generator == null)
{

View File

@ -1,4 +1,4 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNetCore.Http;
@ -27,14 +27,14 @@ namespace Microsoft.AspNetCore.Routing
/// names from <c>RouteOptions</c>.
/// </param>
/// <returns>A URI with an absolute path, or <c>null</c>.</returns>
public static string GetPathByRouteValues(
public static string? GetPathByRouteValues(
this LinkGenerator generator,
HttpContext httpContext,
string routeName,
object values,
string? routeName,
object? values,
PathString? pathBase = default,
FragmentString fragment = default,
LinkOptions options = default)
LinkOptions? options = default)
{
if (generator == null)
{
@ -70,13 +70,13 @@ namespace Microsoft.AspNetCore.Routing
/// names from <c>RouteOptions</c>.
/// </param>
/// <returns>A URI with an absolute path, or <c>null</c>.</returns>
public static string GetPathByRouteValues(
public static string? GetPathByRouteValues(
this LinkGenerator generator,
string routeName,
object values,
string? routeName,
object? values,
PathString pathBase = default,
FragmentString fragment = default,
LinkOptions options = default)
LinkOptions? options = default)
{
if (generator == null)
{
@ -118,16 +118,16 @@ namespace Microsoft.AspNetCore.Routing
/// your deployment environment.
/// </para>
/// </remarks>
public static string GetUriByRouteValues(
public static string? GetUriByRouteValues(
this LinkGenerator generator,
HttpContext httpContext,
string routeName,
object values,
string scheme = default,
string? routeName,
object? values,
string? scheme = default,
HostString? host = default,
PathString? pathBase = default,
FragmentString fragment = default,
LinkOptions options = default)
LinkOptions? options = default)
{
if (generator == null)
{
@ -178,15 +178,15 @@ namespace Microsoft.AspNetCore.Routing
/// your deployment environment.
/// </para>
/// </remarks>
public static string GetUriByRouteValues(
public static string? GetUriByRouteValues(
this LinkGenerator generator,
string routeName,
object values,
string? routeName,
object? values,
string scheme,
HostString host,
PathString pathBase = default,
FragmentString fragment = default,
LinkOptions options = default)
LinkOptions? options = default)
{
if (generator == null)
{
@ -197,7 +197,7 @@ namespace Microsoft.AspNetCore.Routing
return generator.GetUriByAddress<RouteValuesAddress>(address, address.ExplicitValues, scheme, host, pathBase, fragment, options);
}
private static RouteValuesAddress CreateAddress(HttpContext httpContext, string routeName, object values)
private static RouteValuesAddress CreateAddress(HttpContext? httpContext, string? routeName, object? values)
{
return new RouteValuesAddress()
{

View File

@ -32,6 +32,6 @@ namespace Microsoft.AspNetCore.Routing
/// of the route patterns match the provided URI path.
/// </para>
/// </remarks>
public abstract RouteValueDictionary ParsePathByAddress<TAddress>(TAddress address, PathString path);
public abstract RouteValueDictionary? ParsePathByAddress<TAddress>(TAddress address, PathString path);
}
}

View File

@ -33,7 +33,7 @@ namespace Microsoft.AspNetCore.Routing
/// of the route patterns match the provided URI path.
/// </para>
/// </remarks>
public static RouteValueDictionary ParsePathByEndpointName(
public static RouteValueDictionary? ParsePathByEndpointName(
this LinkParser parser,
string endpointName,
PathString path)

View File

@ -8,7 +8,7 @@ namespace Microsoft.AspNetCore.Routing.Logging
{
internal static class RouteConstraintMatcherExtensions
{
private static readonly Action<ILogger, object, string, IRouteConstraint, Exception> _constraintNotMatched;
private static readonly Action<ILogger, object, string, IRouteConstraint, Exception?> _constraintNotMatched;
static RouteConstraintMatcherExtensions()
{

View File

@ -8,7 +8,7 @@ namespace Microsoft.AspNetCore.Routing.Logging
{
internal static class RouterMiddlewareLoggerExtensions
{
private static readonly Action<ILogger, Exception> _requestNotMatched;
private static readonly Action<ILogger, Exception?> _requestNotMatched;
static RouterMiddlewareLoggerExtensions()
{

View File

@ -8,7 +8,7 @@ namespace Microsoft.AspNetCore.Routing.Logging
{
internal static class TreeRouterLoggerExtensions
{
private static readonly Action<ILogger, string, string, Exception> _requestMatchedRoute;
private static readonly Action<ILogger, string, string, Exception?> _requestMatchedRoute;
static TreeRouterLoggerExtensions()
{

View File

@ -154,7 +154,7 @@ namespace Microsoft.AspNetCore.Builder
return routeConstraint;
}
var parameterPolicy = _parameterPolicyFactory.Create(null, inlineConstraint);
var parameterPolicy = _parameterPolicyFactory.Create(null!, inlineConstraint);
if (parameterPolicy != null)
{
// Logic inside Route will skip adding NullRouteConstraint

View File

@ -7,6 +7,7 @@ using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Runtime.CompilerServices;
using Microsoft.AspNetCore.Http;
@ -176,15 +177,17 @@ namespace Microsoft.AspNetCore.Routing.Matching
/// The <see cref="RouteValueDictionary"/> to replace the original <see cref="RouteValueDictionary"/> at
/// the <paramref name="index"/>.
/// </param>
public void ReplaceEndpoint(int index, Endpoint endpoint, RouteValueDictionary values)
public void ReplaceEndpoint(int index, Endpoint? endpoint, RouteValueDictionary? values)
{
// Friendliness for inlining
if ((uint)index >= Count)
{
ThrowIndexArgumentOutOfRangeException();
}
Candidates[index] = new CandidateState(endpoint, values, Candidates[index].Score);
// CandidateState allows a null-valued endpoint. However a validate candidate should never have a null endpoint
// We'll make lives easier for matcher policies by declaring it as non-null.
Candidates[index] = new CandidateState(endpoint!, values, Candidates[index].Score);
if (endpoint == null)
{
@ -354,7 +357,7 @@ namespace Microsoft.AspNetCore.Routing.Matching
{
if (GetOriginalScore(i) == score)
{
duplicates.Add(candidates[i].Endpoint);
duplicates.Add(candidates[i].Endpoint!);
}
}
@ -366,11 +369,13 @@ namespace Microsoft.AspNetCore.Routing.Matching
}
}
[DoesNotReturn]
private static void ThrowIndexArgumentOutOfRangeException()
{
throw new ArgumentOutOfRangeException("index");
}
[DoesNotReturn]
private static void ThrowArgumentNullException(string parameter)
{
throw new ArgumentNullException(parameter);

View File

@ -1,4 +1,4 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Microsoft.AspNetCore.Http;
@ -17,7 +17,7 @@ namespace Microsoft.AspNetCore.Routing.Matching
Values = null;
}
internal CandidateState(Endpoint endpoint, RouteValueDictionary values, int score)
internal CandidateState(Endpoint endpoint, RouteValueDictionary? values, int score)
{
Endpoint = endpoint;
Values = values;
@ -50,6 +50,6 @@ namespace Microsoft.AspNetCore.Routing.Matching
/// Gets <see cref="RouteValueDictionary"/> associated with the
/// <see cref="Http.Endpoint"/> and the current request.
/// </summary>
public RouteValueDictionary Values { get; internal set; }
public RouteValueDictionary? Values { get; internal set; }
}
}

View File

@ -57,10 +57,10 @@ namespace Microsoft.AspNetCore.Routing.Matching
public sealed class Lifetime : IDisposable
{
private readonly object _lock = new object();
private DataSourceDependentCache<Matcher> _cache;
private DataSourceDependentCache<Matcher>? _cache;
private bool _disposed;
public DataSourceDependentCache<Matcher> Cache
public DataSourceDependentCache<Matcher>? Cache
{
get => _cache;
set

View File

@ -47,7 +47,7 @@ namespace Microsoft.AspNetCore.Routing.Matching
if (CandidateSet.IsValidCandidate(ref state))
{
httpContext.SetEndpoint(state.Endpoint);
httpContext.Request.RouteValues = state.Values;
httpContext.Request.RouteValues = state.Values!;
}
break;
@ -67,8 +67,8 @@ namespace Microsoft.AspNetCore.Routing.Matching
HttpContext httpContext,
CandidateState[] candidateState)
{
Endpoint endpoint = null;
RouteValueDictionary values = null;
Endpoint? endpoint = null;
RouteValueDictionary? values = null;
int? foundScore = null;
for (var i = 0; i < candidateState.Length; i++)
{
@ -110,7 +110,7 @@ namespace Microsoft.AspNetCore.Routing.Matching
if (endpoint != null)
{
httpContext.SetEndpoint(endpoint);
httpContext.Request.RouteValues = values;
httpContext.Request.RouteValues = values!;
}
}

View File

@ -40,7 +40,7 @@ namespace Microsoft.AspNetCore.Routing.Matching
// The sequence of actions we take is optimized to avoid doing expensive work
// like creating substrings, creating route value dictionaries, and calling
// into policies like versioning.
var path = httpContext.Request.Path.Value;
var path = httpContext.Request.Path.Value!;
// First tokenize the path into series of segments.
Span<PathSegment> buffer = stackalloc PathSegment[_maxSegmentCount];
@ -119,7 +119,7 @@ namespace Microsoft.AspNetCore.Routing.Matching
// We want to create a new array for the route values based on Slots
// as a prototype.
var prototype = candidate.Slots;
var slots = new KeyValuePair<string, object>[prototype.Length];
var slots = new KeyValuePair<string, object?>[prototype.Length];
if ((flags & Candidate.CandidateFlags.HasDefaults) != 0)
{
@ -221,7 +221,7 @@ namespace Microsoft.AspNetCore.Routing.Matching
}
private void ProcessCaptures(
KeyValuePair<string, object>[] slots,
KeyValuePair<string, object?>[] slots,
(string parameterName, int segmentIndex, int slotIndex)[] captures,
string path,
ReadOnlySpan<PathSegment> segments)
@ -235,7 +235,7 @@ namespace Microsoft.AspNetCore.Routing.Matching
var segment = segments[segmentIndex];
if (parameterName != null && segment.Length > 0)
{
slots[slotIndex] = new KeyValuePair<string, object>(
slots[slotIndex] = new KeyValuePair<string, object?>(
parameterName,
path.Substring(segment.Start, segment.Length));
}
@ -244,7 +244,7 @@ namespace Microsoft.AspNetCore.Routing.Matching
}
private void ProcessCatchAll(
KeyValuePair<string, object>[] slots,
KeyValuePair<string, object?>[] slots,
in (string parameterName, int segmentIndex, int slotIndex) catchAll,
string path,
ReadOnlySpan<PathSegment> segments)
@ -255,7 +255,7 @@ namespace Microsoft.AspNetCore.Routing.Matching
if ((uint)segmentIndex < (uint)segments.Length)
{
var segment = segments[segmentIndex];
slots[catchAll.slotIndex] = new KeyValuePair<string, object>(
slots[catchAll.slotIndex] = new KeyValuePair<string, object?>(
catchAll.parameterName,
path.Substring(segment.Start));
}
@ -333,6 +333,7 @@ namespace Microsoft.AspNetCore.Routing.Matching
public static readonly EventId CandidateValid = new EventId(1005, "CandiateValid");
}
#nullable disable
private static class Logger
{
private static readonly Action<ILogger, string, Exception> _candidatesNotFound = LoggerMessage.Define<string>(

View File

@ -1,6 +1,8 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
#nullable disable
using System;
using System.Collections.Generic;
using System.Linq;

View File

@ -1,6 +1,8 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
#nullable disable
using System;
using System.Collections.Generic;
using System.Diagnostics;

View File

@ -38,7 +38,7 @@ namespace Microsoft.AspNetCore.Routing.Matching
}
}
public int Compare(Endpoint x, Endpoint y)
public int Compare(Endpoint? x, Endpoint? y)
{
// We don't expose this publicly, and we should never call it on
// a null endpoint.
@ -74,7 +74,7 @@ namespace Microsoft.AspNetCore.Routing.Matching
return 0;
}
public bool Equals(Endpoint x, Endpoint y)
public bool Equals(Endpoint? x, Endpoint? y)
{
// We don't expose this publicly, and we should never call it on
// a null endpoint.
@ -109,7 +109,7 @@ namespace Microsoft.AspNetCore.Routing.Matching
{
public static readonly IComparer<Endpoint> Instance = new OrderComparer();
public int Compare(Endpoint x, Endpoint y)
public int Compare(Endpoint? x, Endpoint? y)
{
var routeEndpointX = x as RouteEndpoint;
var routeEndpointY = y as RouteEndpoint;
@ -136,7 +136,7 @@ namespace Microsoft.AspNetCore.Routing.Matching
{
public static readonly IComparer<Endpoint> Instance = new PrecedenceComparer();
public int Compare(Endpoint x, Endpoint y)
public int Compare(Endpoint? x, Endpoint? y)
{
var routeEndpointX = x as RouteEndpoint;
var routeEndpointY = y as RouteEndpoint;

View File

@ -342,7 +342,7 @@ namespace Microsoft.AspNetCore.Routing.Matching
private class HostMetadataEndpointComparer : EndpointMetadataComparer<IHostMetadata>
{
protected override int CompareMetadata(IHostMetadata x, IHostMetadata y)
protected override int CompareMetadata(IHostMetadata? x, IHostMetadata? y)
{
// Ignore the metadata if it has an empty list of hosts.
return base.CompareMetadata(
@ -391,9 +391,9 @@ namespace Microsoft.AspNetCore.Routing.Matching
public readonly int? Port;
public readonly string Host;
private readonly string _wildcardEndsWith;
private readonly string? _wildcardEndsWith;
public EdgeKey(string host, int? port)
public EdgeKey(string? host, int? port)
{
Host = host ?? WildcardHost;
Port = port;
@ -421,9 +421,9 @@ namespace Microsoft.AspNetCore.Routing.Matching
return Comparer<int?>.Default.Compare(Port, other.Port);
}
public int CompareTo(object obj)
public int CompareTo(object? obj)
{
return CompareTo((EdgeKey)obj);
return CompareTo((EdgeKey)obj!);
}
public bool Equals(EdgeKey other)
@ -437,7 +437,7 @@ namespace Microsoft.AspNetCore.Routing.Matching
{
if (HasHostWildcard)
{
return host.EndsWith(_wildcardEndsWith, StringComparison.OrdinalIgnoreCase);
return host.EndsWith(_wildcardEndsWith!, StringComparison.OrdinalIgnoreCase);
}
else
{
@ -454,7 +454,7 @@ namespace Microsoft.AspNetCore.Routing.Matching
return (Host?.GetHashCode() ?? 0) ^ (Port?.GetHashCode() ?? 0);
}
public override bool Equals(object obj)
public override bool Equals(object? obj)
{
if (obj is EdgeKey key)
{

View File

@ -108,7 +108,7 @@ namespace Microsoft.AspNetCore.Routing.Matching
// We want to return a 405 iff we eliminated ALL of the currently valid endpoints due to HTTP method
// mismatch.
bool? needs405Endpoint = null;
HashSet<string> methods = null;
HashSet<string>? methods = null;
for (var i = 0; i < candidates.Count; i++)
{
@ -168,8 +168,8 @@ namespace Microsoft.AspNetCore.Routing.Matching
if (needs405Endpoint == true)
{
// We saw some endpoints coming in, and we eliminated them all.
httpContext.SetEndpoint(CreateRejectionEndpoint(methods.OrderBy(m => m, StringComparer.OrdinalIgnoreCase)));
httpContext.Request.RouteValues = null;
httpContext.SetEndpoint(CreateRejectionEndpoint(methods!.OrderBy(m => m, StringComparer.OrdinalIgnoreCase)));
httpContext.Request.RouteValues = null!;
}
return Task.CompletedTask;
@ -329,8 +329,8 @@ namespace Microsoft.AspNetCore.Routing.Matching
/// <returns></returns>
public PolicyJumpTable BuildJumpTable(int exitDestination, IReadOnlyList<PolicyJumpTableEdge> edges)
{
Dictionary<string, int> destinations = null;
Dictionary<string, int> corsPreflightDestinations = null;
Dictionary<string, int>? destinations = null;
Dictionary<string, int>? corsPreflightDestinations = null;
for (var i = 0; i < edges.Count; i++)
{
// We create this data, so it's safe to cast it.
@ -421,17 +421,17 @@ namespace Microsoft.AspNetCore.Routing.Matching
private class HttpMethodPolicyJumpTable : PolicyJumpTable
{
private readonly int _exitDestination;
private readonly Dictionary<string, int> _destinations;
private readonly Dictionary<string, int>? _destinations;
private readonly int _corsPreflightExitDestination;
private readonly Dictionary<string, int> _corsPreflightDestinations;
private readonly Dictionary<string, int>? _corsPreflightDestinations;
private readonly bool _supportsCorsPreflight;
public HttpMethodPolicyJumpTable(
int exitDestination,
Dictionary<string, int> destinations,
Dictionary<string, int>? destinations,
int corsPreflightExitDestination,
Dictionary<string, int> corsPreflightDestinations)
Dictionary<string, int>? corsPreflightDestinations)
{
_exitDestination = exitDestination;
_destinations = destinations;
@ -466,7 +466,7 @@ namespace Microsoft.AspNetCore.Routing.Matching
private class HttpMethodMetadataEndpointComparer : EndpointMetadataComparer<IHttpMethodMetadata>
{
protected override int CompareMetadata(IHttpMethodMetadata x, IHttpMethodMetadata y)
protected override int CompareMetadata(IHttpMethodMetadata? x, IHttpMethodMetadata? y)
{
// Ignore the metadata if it has an empty list of HTTP methods.
return base.CompareMetadata(
@ -501,9 +501,9 @@ namespace Microsoft.AspNetCore.Routing.Matching
return IsCorsPreflightRequest.CompareTo(other.IsCorsPreflightRequest);
}
public int CompareTo(object obj)
public int CompareTo(object? obj)
{
return CompareTo((EdgeKey)obj);
return CompareTo((EdgeKey)obj!);
}
public bool Equals(EdgeKey other)
@ -513,7 +513,7 @@ namespace Microsoft.AspNetCore.Routing.Matching
HttpMethods.Equals(HttpMethod, other.HttpMethod);
}
public override bool Equals(object obj)
public override bool Equals(object? obj)
{
var other = obj as EdgeKey?;
return other == null ? false : Equals(other.Value);

View File

@ -1,6 +1,8 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
#nullable disable
using System;
using System.Diagnostics;
using System.Linq;

View File

@ -1,6 +1,8 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
#nullable disable
using System;
using System.Threading;
using System.Threading.Tasks;

View File

@ -1,4 +1,4 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
@ -16,7 +16,7 @@ namespace Microsoft.AspNetCore.Routing.Matching
Length = length;
}
public override bool Equals(object obj)
public override bool Equals(object? obj)
{
return obj is PathSegment segment ? Equals(segment) : false;
}

View File

@ -12,7 +12,7 @@ Microsoft.AspNetCore.Routing.RouteCollection</Description>
<PackageTags>aspnetcore;routing</PackageTags>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<IsPackable>false</IsPackable>
<Nullable>annotations</Nullable>
<Nullable>enable</Nullable>
</PropertyGroup>
<PropertyGroup>

View File

@ -1,4 +1,4 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Threading.Tasks;
@ -13,7 +13,7 @@ namespace Microsoft.AspNetCore.Routing
{
}
public VirtualPathData GetVirtualPath(VirtualPathContext context)
public VirtualPathData? GetVirtualPath(VirtualPathContext context)
{
return null;
}

View File

@ -1,12 +1,13 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
#nullable disable
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Text;
using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Routing

View File

@ -26,7 +26,7 @@ namespace Microsoft.AspNetCore.Routing
/// <param name="parameter">The parameter the parameter policy is being created for.</param>
/// <param name="parameterPolicy">An existing parameter policy.</param>
/// <returns>The <see cref="IParameterPolicy"/> for the parameter.</returns>
public abstract IParameterPolicy Create(RoutePatternParameterPart parameter, IParameterPolicy parameterPolicy);
public abstract IParameterPolicy Create(RoutePatternParameterPart? parameter, IParameterPolicy parameterPolicy);
/// <summary>
/// Creates a parameter policy.
@ -34,7 +34,7 @@ namespace Microsoft.AspNetCore.Routing
/// <param name="parameter">The parameter the parameter policy is being created for.</param>
/// <param name="reference">The reference to resolve.</param>
/// <returns>The <see cref="IParameterPolicy"/> for the parameter.</returns>
public IParameterPolicy Create(RoutePatternParameterPart parameter, RoutePatternParameterPolicyReference reference)
public IParameterPolicy Create(RoutePatternParameterPart? parameter, RoutePatternParameterPolicyReference reference)
{
if (reference == null)
{

View File

@ -1,6 +1,8 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
#nullable disable
using System;
using System.Collections;
using System.Collections.Generic;

View File

@ -1,6 +1,8 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
#nullable disable
using System;
using System.Collections.Generic;

View File

@ -78,7 +78,7 @@ namespace Microsoft.AspNetCore.Routing.Patterns
var parseResults = ParseConstraints(parameter, currentIndex, endIndex);
currentIndex = parseResults.CurrentIndex;
string defaultValue = null;
string? defaultValue = null;
if (currentIndex <= endIndex &&
parameter[currentIndex] == '=')
{

View File

@ -27,7 +27,7 @@ namespace Microsoft.AspNetCore.Routing.Patterns
/// </remarks>
public static readonly object RequiredValueAny = new RequiredValueAnySentinal();
internal static bool IsRequiredValueAny(object value)
internal static bool IsRequiredValueAny(object? value)
{
return object.ReferenceEquals(RequiredValueAny, value);
}
@ -35,10 +35,10 @@ namespace Microsoft.AspNetCore.Routing.Patterns
private const string SeparatorString = "/";
internal RoutePattern(
string rawText,
IReadOnlyDictionary<string, object> defaults,
string? rawText,
IReadOnlyDictionary<string, object?> defaults,
IReadOnlyDictionary<string, IReadOnlyList<RoutePatternParameterPolicyReference>> parameterPolicies,
IReadOnlyDictionary<string, object> requiredValues,
IReadOnlyDictionary<string, object?> requiredValues,
IReadOnlyList<RoutePatternParameterPart> parameters,
IReadOnlyList<RoutePatternPathSegment> pathSegments)
{
@ -63,7 +63,7 @@ namespace Microsoft.AspNetCore.Routing.Patterns
/// Gets the set of default values for the route pattern.
/// The keys of <see cref="Defaults"/> are the route parameter names.
/// </summary>
public IReadOnlyDictionary<string, object> Defaults { get; }
public IReadOnlyDictionary<string, object?> Defaults { get; }
/// <summary>
/// Gets the set of parameter policy references for the route pattern.
@ -92,7 +92,7 @@ namespace Microsoft.AspNetCore.Routing.Patterns
/// </example>
/// </para>
/// </remarks>
public IReadOnlyDictionary<string, object> RequiredValues { get; }
public IReadOnlyDictionary<string, object?> RequiredValues { get; }
/// <summary>
/// Gets the precedence value of the route pattern for URL matching.
@ -115,7 +115,7 @@ namespace Microsoft.AspNetCore.Routing.Patterns
/// <summary>
/// Gets the raw text supplied when parsing the route pattern. May be null.
/// </summary>
public string RawText { get; }
public string? RawText { get; }
/// <summary>
/// Gets the list of route parameters.
@ -132,7 +132,7 @@ namespace Microsoft.AspNetCore.Routing.Patterns
/// </summary>
/// <param name="name">The name of the parameter to match.</param>
/// <returns>The matching parameter or <c>null</c> if no parameter matches the given name.</returns>
public RoutePatternParameterPart GetParameter(string name)
public RoutePatternParameterPart? GetParameter(string name)
{
if (name == null)
{

View File

@ -1,4 +1,4 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
@ -15,7 +15,7 @@ namespace Microsoft.AspNetCore.Routing.Patterns
private RoutePatternException(SerializationInfo info, StreamingContext context)
: base(info, context)
{
Pattern = (string)info.GetValue(nameof(Pattern), typeof(string));
Pattern = (string)info.GetValue(nameof(Pattern), typeof(string))!;
}
/// <summary>

View File

@ -17,8 +17,8 @@ namespace Microsoft.AspNetCore.Routing.Patterns
/// </summary>
public static class RoutePatternFactory
{
private static readonly IReadOnlyDictionary<string, object> EmptyDictionary =
new ReadOnlyDictionary<string, object>(new Dictionary<string, object>());
private static readonly IReadOnlyDictionary<string, object?> EmptyDictionary =
new ReadOnlyDictionary<string, object?>(new Dictionary<string, object?>());
private static readonly IReadOnlyDictionary<string, IReadOnlyList<RoutePatternParameterPolicyReference>> EmptyPoliciesDictionary =
new ReadOnlyDictionary<string, IReadOnlyList<RoutePatternParameterPolicyReference>>(new Dictionary<string, IReadOnlyList<RoutePatternParameterPolicyReference>>());
@ -55,7 +55,7 @@ namespace Microsoft.AspNetCore.Routing.Patterns
/// Multiple policies can be specified for a key by providing a collection as the value.
/// </param>
/// <returns>The <see cref="RoutePattern"/>.</returns>
public static RoutePattern Parse(string pattern, object defaults, object parameterPolicies)
public static RoutePattern Parse(string pattern, object? defaults, object? parameterPolicies)
{
if (pattern == null)
{
@ -86,7 +86,7 @@ namespace Microsoft.AspNetCore.Routing.Patterns
/// Route values that can be substituted for parameters in the route pattern. See remarks on <see cref="RoutePattern.RequiredValues"/>.
/// </param>
/// <returns>The <see cref="RoutePattern"/>.</returns>
public static RoutePattern Parse(string pattern, object defaults, object parameterPolicies, object requiredValues)
public static RoutePattern Parse(string pattern, object? defaults, object? parameterPolicies, object? requiredValues)
{
if (pattern == null)
{
@ -118,7 +118,7 @@ namespace Microsoft.AspNetCore.Routing.Patterns
/// <param name="rawText">The raw text to associate with the route pattern. May be null.</param>
/// <param name="segments">The collection of segments.</param>
/// <returns>The <see cref="RoutePattern"/>.</returns>
public static RoutePattern Pattern(string rawText, IEnumerable<RoutePatternPathSegment> segments)
public static RoutePattern Pattern(string? rawText, IEnumerable<RoutePatternPathSegment> segments)
{
if (segments == null)
{
@ -146,8 +146,8 @@ namespace Microsoft.AspNetCore.Routing.Patterns
/// <param name="segments">The collection of segments.</param>
/// <returns>The <see cref="RoutePattern"/>.</returns>
public static RoutePattern Pattern(
object defaults,
object parameterPolicies,
object? defaults,
object? parameterPolicies,
IEnumerable<RoutePatternPathSegment> segments)
{
if (segments == null)
@ -177,9 +177,9 @@ namespace Microsoft.AspNetCore.Routing.Patterns
/// <param name="segments">The collection of segments.</param>
/// <returns>The <see cref="RoutePattern"/>.</returns>
public static RoutePattern Pattern(
string rawText,
object defaults,
object parameterPolicies,
string? rawText,
object? defaults,
object? parameterPolicies,
IEnumerable<RoutePatternPathSegment> segments)
{
if (segments == null)
@ -239,8 +239,8 @@ namespace Microsoft.AspNetCore.Routing.Patterns
/// <param name="segments">The collection of segments.</param>
/// <returns>The <see cref="RoutePattern"/>.</returns>
public static RoutePattern Pattern(
object defaults,
object parameterPolicies,
object? defaults,
object? parameterPolicies,
params RoutePatternPathSegment[] segments)
{
if (segments == null)
@ -270,9 +270,9 @@ namespace Microsoft.AspNetCore.Routing.Patterns
/// <param name="segments">The collection of segments.</param>
/// <returns>The <see cref="RoutePattern"/>.</returns>
public static RoutePattern Pattern(
string rawText,
object defaults,
object parameterPolicies,
string? rawText,
object? defaults,
object? parameterPolicies,
params RoutePatternPathSegment[] segments)
{
if (segments == null)
@ -284,10 +284,10 @@ namespace Microsoft.AspNetCore.Routing.Patterns
}
private static RoutePattern PatternCore(
string rawText,
RouteValueDictionary defaults,
RouteValueDictionary parameterPolicies,
RouteValueDictionary requiredValues,
string? rawText,
RouteValueDictionary? defaults,
RouteValueDictionary? parameterPolicies,
RouteValueDictionary? requiredValues,
IEnumerable<RoutePatternPathSegment> segments)
{
// We want to merge the segment data with the 'out of line' defaults and parameter policies.
@ -301,10 +301,10 @@ namespace Microsoft.AspNetCore.Routing.Patterns
// It's important that these two views of the data are consistent. We don't want
// values specified out of line to have a different behavior.
Dictionary<string, object> updatedDefaults = null;
Dictionary<string, object?>? updatedDefaults = null;
if (defaults != null && defaults.Count > 0)
{
updatedDefaults = new Dictionary<string, object>(defaults.Count, StringComparer.OrdinalIgnoreCase);
updatedDefaults = new Dictionary<string, object?>(defaults.Count, StringComparer.OrdinalIgnoreCase);
foreach (var kvp in defaults)
{
@ -312,7 +312,7 @@ namespace Microsoft.AspNetCore.Routing.Patterns
}
}
Dictionary<string, List<RoutePatternParameterPolicyReference>> updatedParameterPolicies = null;
Dictionary<string, List<RoutePatternParameterPolicyReference>>? updatedParameterPolicies = null;
if (parameterPolicies != null && parameterPolicies.Count > 0)
{
updatedParameterPolicies = new Dictionary<string, List<RoutePatternParameterPolicyReference>>(parameterPolicies.Count, StringComparer.OrdinalIgnoreCase);
@ -349,7 +349,7 @@ namespace Microsoft.AspNetCore.Routing.Patterns
}
}
List<RoutePatternParameterPart> parameters = null;
List<RoutePatternParameterPart>? parameters = null;
var updatedSegments = segments.ToArray();
for (var i = 0; i < updatedSegments.Length; i++)
{
@ -420,12 +420,12 @@ namespace Microsoft.AspNetCore.Routing.Patterns
? updatedParameterPolicies.ToDictionary(kvp => kvp.Key, kvp => (IReadOnlyList<RoutePatternParameterPolicyReference>)kvp.Value.ToArray())
: EmptyPoliciesDictionary,
requiredValues ?? EmptyDictionary,
(IReadOnlyList<RoutePatternParameterPart>)parameters ?? Array.Empty<RoutePatternParameterPart>(),
(IReadOnlyList<RoutePatternParameterPart>?)parameters ?? Array.Empty<RoutePatternParameterPart>(),
updatedSegments);
RoutePatternPathSegment VisitSegment(RoutePatternPathSegment segment)
{
RoutePatternPart[] updatedParts = null;
RoutePatternPart[]? updatedParts = null;
for (var i = 0; i < segment.Parts.Count; i++)
{
var part = segment.Parts[i];
@ -482,13 +482,13 @@ namespace Microsoft.AspNetCore.Routing.Patterns
{
if (updatedDefaults == null)
{
updatedDefaults = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
updatedDefaults = new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase);
}
updatedDefaults[parameter.Name] = parameter.Default;
}
List<RoutePatternParameterPolicyReference> parameterConstraints = null;
List<RoutePatternParameterPolicyReference>? parameterConstraints = null;
if ((updatedParameterPolicies == null || !updatedParameterPolicies.TryGetValue(parameter.Name, out parameterConstraints)) &&
parameter.ParameterPolicies.Count > 0)
{
@ -503,7 +503,7 @@ namespace Microsoft.AspNetCore.Routing.Patterns
if (parameter.ParameterPolicies.Count > 0)
{
parameterConstraints.AddRange(parameter.ParameterPolicies);
parameterConstraints!.AddRange(parameter.ParameterPolicies);
}
if (Equals(parameter.Default, @default)
@ -667,7 +667,7 @@ namespace Microsoft.AspNetCore.Routing.Patterns
/// <returns>The <see cref="RoutePatternParameterPart"/>.</returns>
public static RoutePatternParameterPart ParameterPart(
string parameterName,
object @default,
object? @default,
RoutePatternParameterKind parameterKind)
{
if (string.IsNullOrEmpty(parameterName))
@ -703,7 +703,7 @@ namespace Microsoft.AspNetCore.Routing.Patterns
/// <returns>The <see cref="RoutePatternParameterPart"/>.</returns>
public static RoutePatternParameterPart ParameterPart(
string parameterName,
object @default,
object? @default,
RoutePatternParameterKind parameterKind,
IEnumerable<RoutePatternParameterPolicyReference> parameterPolicies)
{
@ -745,7 +745,7 @@ namespace Microsoft.AspNetCore.Routing.Patterns
/// <returns>The <see cref="RoutePatternParameterPart"/>.</returns>
public static RoutePatternParameterPart ParameterPart(
string parameterName,
object @default,
object? @default,
RoutePatternParameterKind parameterKind,
params RoutePatternParameterPolicyReference[] parameterPolicies)
{
@ -778,7 +778,7 @@ namespace Microsoft.AspNetCore.Routing.Patterns
private static RoutePatternParameterPart ParameterPartCore(
string parameterName,
object @default,
object? @default,
RoutePatternParameterKind parameterKind,
RoutePatternParameterPolicyReference[] parameterPolicies)
{
@ -787,7 +787,7 @@ namespace Microsoft.AspNetCore.Routing.Patterns
private static RoutePatternParameterPart ParameterPartCore(
string parameterName,
object @default,
object? @default,
RoutePatternParameterKind parameterKind,
RoutePatternParameterPolicyReference[] parameterPolicies,
bool encodeSlashes)
@ -906,7 +906,7 @@ namespace Microsoft.AspNetCore.Routing.Patterns
return new RoutePatternParameterPolicyReference(parameterPolicy);
}
private static RouteValueDictionary Wrap(object values)
private static RouteValueDictionary? Wrap(object? values)
{
return values == null ? null : new RouteValueDictionary(values);
}

View File

@ -1,6 +1,8 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
#nullable disable
using System;
using System.Diagnostics;
using Microsoft.AspNetCore.Http;

View File

@ -1,4 +1,4 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Collections.Generic;
@ -16,7 +16,7 @@ namespace Microsoft.AspNetCore.Routing.Patterns
{
internal RoutePatternParameterPart(
string parameterName,
object @default,
object? @default,
RoutePatternParameterKind parameterKind,
RoutePatternParameterPolicyReference[] parameterPolicies)
: this(parameterName, @default, parameterKind, parameterPolicies, encodeSlashes: true)
@ -25,7 +25,7 @@ namespace Microsoft.AspNetCore.Routing.Patterns
internal RoutePatternParameterPart(
string parameterName,
object @default,
object? @default,
RoutePatternParameterKind parameterKind,
RoutePatternParameterPolicyReference[] parameterPolicies,
bool encodeSlashes)
@ -53,7 +53,7 @@ namespace Microsoft.AspNetCore.Routing.Patterns
/// <summary>
/// Gets the default value of this route parameter. May be null.
/// </summary>
public object Default { get; }
public object? Default { get; }
/// <summary>
/// Returns <c>true</c> if this part is a catch-all parameter.

View File

@ -1,4 +1,4 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Diagnostics;
@ -26,16 +26,16 @@ namespace Microsoft.AspNetCore.Routing.Patterns
/// <summary>
/// Gets the constraint text.
/// </summary>
public string Content { get; }
public string? Content { get; }
/// <summary>
/// Gets a pre-existing <see cref="IParameterPolicy"/> that was used to construct this reference.
/// </summary>
public IParameterPolicy ParameterPolicy { get; }
public IParameterPolicy? ParameterPolicy { get; }
private string DebuggerToString()
private string? DebuggerToString()
{
return Content;
}
}
}
}

View File

@ -1,6 +1,8 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
#nullable disable
using System;
using System.Collections.Generic;
using System.Diagnostics;

View File

@ -1,4 +1,4 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
namespace Microsoft.AspNetCore.Routing.Patterns
@ -30,6 +30,6 @@ namespace Microsoft.AspNetCore.Routing.Patterns
/// return <c>null</c> if any required value cannot be substituted.
/// </para>
/// </remarks>
public abstract RoutePattern SubstituteRequiredValues(RoutePattern original, object requiredValues);
public abstract RoutePattern? SubstituteRequiredValues(RoutePattern original, object requiredValues);
}
}

View File

@ -259,7 +259,7 @@ namespace Microsoft.AspNetCore.Routing
new RouteHandler(handler),
template,
defaults: null,
constraints: new RouteValueDictionary(new { httpMethod = new HttpMethodRouteConstraint(verb) }),
constraints: new RouteValueDictionary(new { httpMethod = new HttpMethodRouteConstraint(verb) })!,
dataTokens: null,
inlineConstraintResolver: GetConstraintResolver(builder));

View File

@ -1,8 +1,6 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
#nullable enable
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
@ -62,7 +60,7 @@ namespace Microsoft.AspNetCore.Routing
_target = target;
}
public string RouteTemplate => ParsedTemplate.TemplateText;
public string? RouteTemplate => ParsedTemplate.TemplateText;
protected override Task OnRouteMatched(RouteContext context)
{

View File

@ -1,8 +1,6 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
#nullable enable
using System;
using System.Collections.Generic;
using System.Diagnostics;
@ -110,7 +108,7 @@ namespace Microsoft.AspNetCore.Routing
{
return Task.CompletedTask;
}
_logger.RequestMatchedRoute(Name!, ParsedTemplate.TemplateText);
_logger.RequestMatchedRoute(Name!, ParsedTemplate.TemplateText!);
return OnRouteMatched(context);
}
@ -175,7 +173,7 @@ namespace Microsoft.AspNetCore.Routing
RouteTemplate parsedTemplate,
IDictionary<string, object>? constraints)
{
var constraintBuilder = new RouteConstraintBuilder(inlineConstraintResolver, parsedTemplate.TemplateText);
var constraintBuilder = new RouteConstraintBuilder(inlineConstraintResolver, parsedTemplate.TemplateText!);
if (constraints != null)
{
@ -189,12 +187,12 @@ namespace Microsoft.AspNetCore.Routing
{
if (parameter.IsOptional)
{
constraintBuilder.SetOptional(parameter.Name);
constraintBuilder.SetOptional(parameter.Name!);
}
foreach (var inlineConstraint in parameter.InlineConstraints)
{
constraintBuilder.AddResolvedConstraint(parameter.Name, inlineConstraint.Constraint);
constraintBuilder.AddResolvedConstraint(parameter.Name!, inlineConstraint.Constraint);
}
}
@ -219,7 +217,7 @@ namespace Microsoft.AspNetCore.Routing
parameter.Name));
}
#else
if (result.ContainsKey(parameter.Name))
if (result.ContainsKey(parameter.Name!))
{
throw new InvalidOperationException(
Resources.FormatTemplateRoute_CannotHaveDefaultValueSpecifiedInlineAndExplicitly(
@ -227,7 +225,7 @@ namespace Microsoft.AspNetCore.Routing
}
else
{
result.Add(parameter.Name, parameter.DefaultValue);
result.Add(parameter.Name!, parameter.DefaultValue);
}
#endif
}
@ -300,7 +298,7 @@ namespace Microsoft.AspNetCore.Routing
public override string ToString()
{
return ParsedTemplate.TemplateText;
return ParsedTemplate.TemplateText!;
}
}
}

View File

@ -53,7 +53,7 @@ namespace Microsoft.AspNetCore.Routing
{
routeValues.TryGetValue(kvp.Key, out var routeValue);
logger.ConstraintNotMatched(routeValue, kvp.Key, kvp.Value);
logger.ConstraintNotMatched(routeValue!, kvp.Key, kvp.Value);
}
return false;

View File

@ -1,4 +1,4 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
@ -28,8 +28,8 @@ namespace Microsoft.AspNetCore.Routing
RequestDelegate requestDelegate,
RoutePattern routePattern,
int order,
EndpointMetadataCollection metadata,
string displayName)
EndpointMetadataCollection? metadata,
string? displayName)
: base(requestDelegate, metadata, displayName)
{
if (requestDelegate == null)

View File

@ -1,6 +1,7 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing.Patterns;
@ -25,6 +26,11 @@ namespace Microsoft.AspNetCore.Routing
public override Endpoint Build()
{
if (RequestDelegate is null)
{
throw new InvalidOperationException($"{nameof(RequestDelegate)} must be specified to construct a {nameof(RouteEndpoint)}.");
}
var routeEndpoint = new RouteEndpoint(
RequestDelegate,
RoutePattern,

View File

@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Routing
public class RouteOptions
{
private IDictionary<string, Type> _constraintTypeMap = GetDefaultConstraintMap();
private ICollection<EndpointDataSource> _endpointDataSources;
private ICollection<EndpointDataSource> _endpointDataSources = default!;
/// <summary>
/// Gets a collection of <see cref="EndpointDataSource"/> instances configured with routing.

View File

@ -18,12 +18,12 @@ namespace Microsoft.AspNetCore.Routing
///
/// strings are compared using <see cref="StringComparison.OrdinalIgnoreCase"/>.
/// </remarks>
public class RouteValueEqualityComparer : IEqualityComparer<object>
public class RouteValueEqualityComparer : IEqualityComparer<object?>
{
public static readonly RouteValueEqualityComparer Default = new RouteValueEqualityComparer();
/// <inheritdoc />
public new bool Equals(object x, object y)
public new bool Equals(object? x, object? y)
{
var stringX = x as string ?? Convert.ToString(x, CultureInfo.InvariantCulture);
var stringY = y as string ?? Convert.ToString(y, CultureInfo.InvariantCulture);
@ -52,4 +52,4 @@ namespace Microsoft.AspNetCore.Routing
}
}
}
}
}

View File

@ -30,7 +30,7 @@ namespace Microsoft.AspNetCore.Routing
var state = State;
IList<OutboundMatchResult> matchResults = null;
IList<OutboundMatchResult>? matchResults = null;
if (string.IsNullOrEmpty(address.RouteName))
{
matchResults = state.AllMatchesLinkGenerationTree.GetMatches(
@ -141,8 +141,8 @@ namespace Microsoft.AspNetCore.Routing
private OutboundRouteEntry CreateOutboundRouteEntry(
RouteEndpoint endpoint,
IReadOnlyDictionary<string, object> requiredValues,
string routeName)
IReadOnlyDictionary<string, object?> requiredValues,
string? routeName)
{
var entry = new OutboundRouteEntry()
{

View File

@ -32,7 +32,7 @@ namespace Microsoft.AspNetCore.Routing.Template
throw new ArgumentNullException(nameof(other));
}
Constraint = other.Content;
Constraint = other.Content!;
}
/// <summary>
@ -40,4 +40,4 @@ namespace Microsoft.AspNetCore.Routing.Template
/// </summary>
public string Constraint { get; }
}
}
}

View File

@ -68,7 +68,7 @@ namespace Microsoft.AspNetCore.Routing.Template
}
}
public string TemplateText { get; }
public string? TemplateText { get; }
public IList<TemplatePart> Parameters { get; }

View File

@ -1,8 +1,6 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
#nullable enable
using System;
using System.Collections;
using System.Collections.Generic;

View File

@ -51,7 +51,7 @@ namespace Microsoft.AspNetCore.Routing.Template
continue;
}
if (Defaults.TryGetValue(part.Name, out var value))
if (Defaults.TryGetValue(part.Name!, out var value))
{
_hasDefaultValue[i] = true;
_defaultValues[i] = value;

View File

@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Microsoft.AspNetCore.Routing.Patterns;
@ -32,7 +33,7 @@ namespace Microsoft.AspNetCore.Routing.Template
IsCatchAll = parameter.IsCatchAll;
IsOptional = parameter.IsOptional;
DefaultValue = parameter.Default;
InlineConstraints = parameter.ParameterPolicies?.Select(p => new InlineConstraint(p));
InlineConstraints = parameter.ParameterPolicies?.Select(p => new InlineConstraint(p)) ?? Enumerable.Empty<InlineConstraint>();
}
else if (other.IsSeparator && other is RoutePatternSeparatorPart separator)
{
@ -59,8 +60,8 @@ namespace Microsoft.AspNetCore.Routing.Template
string name,
bool isCatchAll,
bool isOptional,
object defaultValue,
IEnumerable<InlineConstraint> inlineConstraints)
object? defaultValue,
IEnumerable<InlineConstraint>? inlineConstraints)
{
if (name == null)
{
@ -83,12 +84,12 @@ namespace Microsoft.AspNetCore.Routing.Template
public bool IsParameter { get; private set; }
public bool IsOptional { get; private set; }
public bool IsOptionalSeperator { get; set; }
public string Name { get; private set; }
public string Text { get; private set; }
public object DefaultValue { get; private set; }
public IEnumerable<InlineConstraint> InlineConstraints { get; private set; }
public string? Name { get; private set; }
public string? Text { get; private set; }
public object? DefaultValue { get; private set; }
public IEnumerable<InlineConstraint> InlineConstraints { get; private set; } = Enumerable.Empty<InlineConstraint>();
internal string DebuggerToString()
internal string? DebuggerToString()
{
if (IsParameter)
{
@ -104,11 +105,11 @@ namespace Microsoft.AspNetCore.Routing.Template
{
if (IsLiteral && IsOptionalSeperator)
{
return RoutePatternFactory.SeparatorPart(Text);
return RoutePatternFactory.SeparatorPart(Text!);
}
else if (IsLiteral)
{
return RoutePatternFactory.LiteralPart(Text);
return RoutePatternFactory.LiteralPart(Text!);
}
else
{
@ -119,7 +120,7 @@ namespace Microsoft.AspNetCore.Routing.Template
RoutePatternParameterKind.Standard;
var constraints = InlineConstraints.Select(c => new RoutePatternParameterPolicyReference(c.Constraint));
return RoutePatternFactory.ParameterPart(Name, DefaultValue, kind, constraints);
return RoutePatternFactory.ParameterPart(Name!, DefaultValue, kind, constraints);
}
}
}

View File

@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Routing.Template
/// <summary>
/// The set of values that will appear in the URL.
/// </summary>
public RouteValueDictionary AcceptedValues { get; set; }
public RouteValueDictionary AcceptedValues { get; set; } = default!;
/// <summary>
/// The set of values that that were supplied for URL generation.
@ -24,6 +24,6 @@ namespace Microsoft.AspNetCore.Routing.Template
/// Implicit (ambient) values which are invalidated due to changes in values lexically earlier in the
/// route template are excluded from this set.
/// </remarks>
public RouteValueDictionary CombinedValues { get; set; }
public RouteValueDictionary CombinedValues { get; set; } = default!;
}
}
}

View File

@ -1,6 +1,8 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
#nullable disable
using System.Diagnostics;
using Microsoft.AspNetCore.Routing.Template;

View File

@ -1,6 +1,8 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
#nullable disable
using System.Collections.Generic;
using Microsoft.AspNetCore.Routing.Template;

View File

@ -1,6 +1,8 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
#nullable disable
using System;
using System.Collections.Generic;
using System.Diagnostics;

View File

@ -1,6 +1,8 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
#nullable disable
using Microsoft.AspNetCore.Routing.Template;
namespace Microsoft.AspNetCore.Routing.Tree

View File

@ -1,6 +1,8 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
#nullable disable
using System.Collections.Generic;
using Microsoft.AspNetCore.Routing.Template;
@ -64,4 +66,4 @@ namespace Microsoft.AspNetCore.Routing.Tree
/// </summary>
public object Data { get; set; }
}
}
}

View File

@ -1,6 +1,8 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
#nullable disable
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;

View File

@ -1,6 +1,8 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
#nullable disable
using System;
using System.Collections.Generic;
using System.Linq;

View File

@ -1,6 +1,8 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
#nullable disable
using System;
using System.Collections.Generic;
using System.Text.Encodings.Web;

View File

@ -1,6 +1,8 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
#nullable disable
using System;
using System.Collections.Generic;
using System.Diagnostics;

View File

@ -158,7 +158,7 @@ namespace Microsoft.AspNetCore.Routing.Tree
current.Matches.Sort((x, y) =>
{
var result = x.Entry.Precedence.CompareTo(y.Entry.Precedence);
return result == 0 ? x.Entry.RouteTemplate.TemplateText.CompareTo(y.Entry.RouteTemplate.TemplateText) : result;
return result == 0 ? x.Entry.RouteTemplate.TemplateText!.CompareTo(y.Entry.RouteTemplate.TemplateText) : result;
});
}