@@ -347,19 +347,23 @@ private NullabilityInfo GetNullabilityInfo(MemberInfo memberInfo, Type type, ILi
347
347
private NullabilityInfo GetNullabilityInfo ( MemberInfo memberInfo , Type type , IList < CustomAttributeData > customAttributes , int index )
348
348
{
349
349
NullabilityState state = NullabilityState . Unknown ;
350
+ NullabilityInfo ? elementState = null ;
351
+ NullabilityInfo [ ] genericArgumentsState = Array . Empty < NullabilityInfo > ( ) ;
352
+ Type ? underlyingType = type ;
350
353
351
354
if ( type . IsValueType )
352
355
{
353
- if ( Nullable . GetUnderlyingType ( type ) != null )
356
+ underlyingType = Nullable . GetUnderlyingType ( type ) ;
357
+
358
+ if ( underlyingType != null )
354
359
{
355
360
state = NullabilityState . Nullable ;
356
361
}
357
362
else
358
363
{
364
+ underlyingType = type ;
359
365
state = NullabilityState . NotNull ;
360
366
}
361
-
362
- return new NullabilityInfo ( type , state , state , null , Array . Empty < NullabilityInfo > ( ) ) ;
363
367
}
364
368
else
365
369
{
@@ -368,32 +372,38 @@ private NullabilityInfo GetNullabilityInfo(MemberInfo memberInfo, Type type, ILi
368
372
state = GetNullableContext ( memberInfo ) ;
369
373
}
370
374
371
- NullabilityInfo ? elementState = null ;
372
- NullabilityInfo [ ] ? genericArgumentsState = null ;
373
-
374
375
if ( type . IsArray )
375
376
{
376
377
elementState = GetNullabilityInfo ( memberInfo , type . GetElementType ( ) ! , customAttributes , index + 1 ) ;
377
378
}
378
- else if ( type . IsGenericType )
379
+ }
380
+
381
+ if ( underlyingType . IsGenericType )
382
+ {
383
+ Type [ ] genericArguments = underlyingType . GetGenericArguments ( ) ;
384
+ genericArgumentsState = new NullabilityInfo [ genericArguments . Length ] ;
385
+
386
+ for ( int i = 0 , offset = 0 ; i < genericArguments . Length ; i ++ )
379
387
{
380
- Type [ ] genericArguments = type . GetGenericArguments ( ) ;
381
- genericArgumentsState = new NullabilityInfo [ genericArguments . Length ] ;
388
+ Type t = Nullable . GetUnderlyingType ( genericArguments [ i ] ) ?? genericArguments [ i ] ;
382
389
383
- for ( int i = 0 ; i < genericArguments . Length ; i ++ )
390
+ if ( ! t . IsValueType || t . IsGenericType )
384
391
{
385
- genericArgumentsState [ i ] = GetNullabilityInfo ( memberInfo , genericArguments [ i ] , customAttributes , i + 1 ) ;
392
+ offset ++ ;
386
393
}
387
- }
388
394
389
- NullabilityInfo nullability = new NullabilityInfo ( type , state , state , elementState , genericArgumentsState ?? Array . Empty < NullabilityInfo > ( ) ) ;
390
- if ( state != NullabilityState . Unknown )
391
- {
392
- TryLoadGenericMetaTypeNullability ( memberInfo , nullability ) ;
395
+ genericArgumentsState [ i ] = GetNullabilityInfo ( memberInfo , genericArguments [ i ] , customAttributes , index + offset ) ;
393
396
}
397
+ }
398
+
399
+ NullabilityInfo nullability = new NullabilityInfo ( type , state , state , elementState , genericArgumentsState ) ;
394
400
395
- return nullability ;
401
+ if ( ! type . IsValueType && state != NullabilityState . Unknown )
402
+ {
403
+ TryLoadGenericMetaTypeNullability ( memberInfo , nullability ) ;
396
404
}
405
+
406
+ return nullability ;
397
407
}
398
408
399
409
private static bool ParseNullableState ( IList < CustomAttributeData > customAttributes , int index , ref NullabilityState state )
@@ -472,7 +482,7 @@ private void CheckGenericParameters(NullabilityInfo nullability, MemberInfo meta
472
482
{
473
483
NullabilityState state = nullability . ReadState ;
474
484
475
- if ( ! ParseNullableState ( metaType . GetCustomAttributesData ( ) , 0 , ref state ) )
485
+ if ( state == NullabilityState . NotNull && ! ParseNullableState ( metaType . GetCustomAttributesData ( ) , 0 , ref state ) )
476
486
{
477
487
state = GetNullableContext ( metaType ) ;
478
488
}
0 commit comments