@@ -627,8 +627,7 @@ private static Expression GetValueFromProperty(Expression sourceExpression, stri
627
627
628
628
private static Expression BindParameterFromService ( ParameterInfo parameter )
629
629
{
630
- var nullability = NullabilityContext . Create ( parameter ) ;
631
- var isOptional = parameter . HasDefaultValue || nullability . ReadState == NullabilityState . Nullable ;
630
+ var isOptional = IsOptionalParameter ( parameter ) ;
632
631
633
632
return isOptional
634
633
? Expression . Call ( GetServiceMethod . MakeGenericMethod ( parameter . ParameterType ) , RequestServicesExpr )
@@ -637,8 +636,7 @@ private static Expression BindParameterFromService(ParameterInfo parameter)
637
636
638
637
private static Expression BindParameterFromValue ( ParameterInfo parameter , Expression valueExpression , FactoryContext factoryContext )
639
638
{
640
- var nullability = NullabilityContext . Create ( parameter ) ;
641
- var isOptional = parameter . HasDefaultValue || nullability . ReadState == NullabilityState . Nullable ;
639
+ var isOptional = IsOptionalParameter ( parameter ) ;
642
640
643
641
var argument = Expression . Variable ( parameter . ParameterType , $ "{ parameter . Name } _local") ;
644
642
@@ -671,7 +669,8 @@ private static Expression BindParameterFromValue(ParameterInfo parameter, Expres
671
669
}
672
670
673
671
// Allow nullable parameters that don't have a default value
674
- if ( nullability . ReadState == NullabilityState . Nullable && ! parameter . HasDefaultValue )
672
+ var nullability = NullabilityContext . Create ( parameter ) ;
673
+ if ( nullability . ReadState != NullabilityState . NotNull && ! parameter . HasDefaultValue )
675
674
{
676
675
return valueExpression ;
677
676
}
@@ -817,7 +816,7 @@ private static Expression BindParameterFromBindAsync(ParameterInfo parameter, Fa
817
816
{
818
817
// We reference the boundValues array by parameter index here
819
818
var nullability = NullabilityContext . Create ( parameter ) ;
820
- var isOptional = parameter . HasDefaultValue || nullability . ReadState == NullabilityState . Nullable ;
819
+ var isOptional = IsOptionalParameter ( parameter ) ;
821
820
822
821
// Get the BindAsync method
823
822
var body = TryParseMethodCache . FindBindAsyncMethod ( parameter . ParameterType ) ! ;
@@ -862,8 +861,7 @@ private static Expression BindParameterFromBody(ParameterInfo parameter, bool al
862
861
}
863
862
}
864
863
865
- var nullability = NullabilityContext . Create ( parameter ) ;
866
- var isOptional = parameter . HasDefaultValue || nullability . ReadState == NullabilityState . Nullable ;
864
+ var isOptional = IsOptionalParameter ( parameter ) ;
867
865
868
866
factoryContext . JsonRequestBodyType = parameter . ParameterType ;
869
867
factoryContext . AllowEmptyRequestBody = allowEmpty || isOptional ;
@@ -903,6 +901,19 @@ private static Expression BindParameterFromBody(ParameterInfo parameter, bool al
903
901
return Expression . Convert ( BodyValueExpr , parameter . ParameterType ) ;
904
902
}
905
903
904
+ private static bool IsOptionalParameter ( ParameterInfo parameter )
905
+ {
906
+ // - Parameters representing value or reference types with a default value
907
+ // under any nullability context are treated as optional.
908
+ // - Value type parameters without a default value in an oblivious
909
+ // nullability context are required.
910
+ // - Reference type parameters without a default value in an oblivious
911
+ // nullability context are optional.
912
+ var nullability = NullabilityContext . Create ( parameter ) ;
913
+ return parameter . HasDefaultValue
914
+ || nullability . ReadState != NullabilityState . NotNull ;
915
+ }
916
+
906
917
private static MethodInfo GetMethodInfo < T > ( Expression < T > expr )
907
918
{
908
919
var mc = ( MethodCallExpression ) expr . Body ;
0 commit comments