1
+ // Licensed to the .NET Foundation under one or more agreements.
2
+ // The .NET Foundation licenses this file to you under the MIT license.
3
+
4
+ namespace System . Diagnostics . CodeAnalysis
5
+ {
6
+ #if ! NETCOREAPP3_0_OR_GREATER
7
+ /// <summary>Specifies that null is allowed as an input even if the corresponding type disallows it.</summary>
8
+ [ AttributeUsage ( AttributeTargets . Field | AttributeTargets . Parameter | AttributeTargets . Property , Inherited = false ) ]
9
+ internal sealed class AllowNullAttribute : Attribute
10
+ { }
11
+
12
+ /// <summary>Specifies that null is disallowed as an input even if the corresponding type allows it.</summary>
13
+ [ AttributeUsage ( AttributeTargets . Field | AttributeTargets . Parameter | AttributeTargets . Property , Inherited = false ) ]
14
+ internal sealed class DisallowNullAttribute : Attribute
15
+ { }
16
+
17
+ /// <summary>Specifies that an output may be null even if the corresponding type disallows it.</summary>
18
+ [ AttributeUsage ( AttributeTargets . Field | AttributeTargets . Parameter | AttributeTargets . Property | AttributeTargets . ReturnValue , Inherited = false ) ]
19
+ internal sealed class MaybeNullAttribute : Attribute
20
+ { }
21
+
22
+ /// <summary>Specifies that an output will not be null even if the corresponding type allows it. Specifies that an input argument was not null when the call returns.</summary>
23
+ [ AttributeUsage ( AttributeTargets . Field | AttributeTargets . Parameter | AttributeTargets . Property | AttributeTargets . ReturnValue , Inherited = false ) ]
24
+ internal sealed class NotNullAttribute : Attribute
25
+ { }
26
+
27
+ /// <summary>Specifies that when a method returns <see cref="ReturnValue"/>, the parameter may be null even if the corresponding type disallows it.</summary>
28
+ [ AttributeUsage ( AttributeTargets . Parameter , Inherited = false ) ]
29
+ internal sealed class MaybeNullWhenAttribute : Attribute
30
+ {
31
+ /// <summary>Initializes the attribute with the specified return value condition.</summary>
32
+ /// <param name="returnValue">
33
+ /// The return value condition. If the method returns this value, the associated parameter may be null.
34
+ /// </param>
35
+ public MaybeNullWhenAttribute ( bool returnValue ) => ReturnValue = returnValue ;
36
+
37
+ /// <summary>Gets the return value condition.</summary>
38
+ public bool ReturnValue { get ; }
39
+ }
40
+
41
+ /// <summary>Specifies that when a method returns <see cref="ReturnValue"/>, the parameter will not be null even if the corresponding type allows it.</summary>
42
+ [ AttributeUsage ( AttributeTargets . Parameter , Inherited = false ) ]
43
+ internal sealed class NotNullWhenAttribute : Attribute
44
+ {
45
+ /// <summary>Initializes the attribute with the specified return value condition.</summary>
46
+ /// <param name="returnValue">
47
+ /// The return value condition. If the method returns this value, the associated parameter will not be null.
48
+ /// </param>
49
+ public NotNullWhenAttribute ( bool returnValue ) => ReturnValue = returnValue ;
50
+
51
+ /// <summary>Gets the return value condition.</summary>
52
+ public bool ReturnValue { get ; }
53
+ }
54
+
55
+ /// <summary>Specifies that the output will be non-null if the named parameter is non-null.</summary>
56
+ [ AttributeUsage ( AttributeTargets . Parameter | AttributeTargets . Property | AttributeTargets . ReturnValue , AllowMultiple = true , Inherited = false ) ]
57
+ internal sealed class NotNullIfNotNullAttribute : Attribute
58
+ {
59
+ /// <summary>Initializes the attribute with the associated parameter name.</summary>
60
+ /// <param name="parameterName">
61
+ /// The associated parameter name. The output will be non-null if the argument to the parameter specified is non-null.
62
+ /// </param>
63
+ public NotNullIfNotNullAttribute ( string parameterName ) => ParameterName = parameterName ;
64
+
65
+ /// <summary>Gets the associated parameter name.</summary>
66
+ public string ParameterName { get ; }
67
+ }
68
+
69
+ /// <summary>Applied to a method that will never return under any circumstance.</summary>
70
+ [ AttributeUsage ( AttributeTargets . Method , Inherited = false ) ]
71
+ internal sealed class DoesNotReturnAttribute : Attribute
72
+ { }
73
+
74
+ /// <summary>Specifies that the method will not return if the associated Boolean parameter is passed the specified value.</summary>
75
+ [ AttributeUsage ( AttributeTargets . Parameter , Inherited = false ) ]
76
+ internal sealed class DoesNotReturnIfAttribute : Attribute
77
+ {
78
+ /// <summary>Initializes the attribute with the specified parameter value.</summary>
79
+ /// <param name="parameterValue">
80
+ /// The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to
81
+ /// the associated parameter matches this value.
82
+ /// </param>
83
+ public DoesNotReturnIfAttribute ( bool parameterValue ) => ParameterValue = parameterValue ;
84
+
85
+ /// <summary>Gets the condition parameter value.</summary>
86
+ public bool ParameterValue { get ; }
87
+ }
88
+
89
+ #endif
90
+ #if ! NET5_0_OR_GREATER
91
+
92
+ /// <summary>Specifies that the method or property will ensure that the listed field and property members have not-null values.</summary>
93
+ [ AttributeUsage ( AttributeTargets . Method | AttributeTargets . Property , Inherited = false , AllowMultiple = true ) ]
94
+ internal sealed class MemberNotNullAttribute : Attribute
95
+ {
96
+ /// <summary>Initializes the attribute with a field or property member.</summary>
97
+ /// <param name="member">
98
+ /// The field or property member that is promised to be not-null.
99
+ /// </param>
100
+ public MemberNotNullAttribute ( string member ) => Members = new [ ] { member } ;
101
+
102
+ /// <summary>Initializes the attribute with the list of field and property members.</summary>
103
+ /// <param name="members">
104
+ /// The list of field and property members that are promised to be not-null.
105
+ /// </param>
106
+ public MemberNotNullAttribute ( params string [ ] members ) => Members = members ;
107
+
108
+ /// <summary>Gets field or property member names.</summary>
109
+ public string [ ] Members { get ; }
110
+ }
111
+
112
+ /// <summary>Specifies that the method or property will ensure that the listed field and property members have not-null values when returning with the specified return value condition.</summary>
113
+ [ AttributeUsage ( AttributeTargets . Method | AttributeTargets . Property , Inherited = false , AllowMultiple = true ) ]
114
+ internal sealed class MemberNotNullWhenAttribute : Attribute
115
+ {
116
+ /// <summary>Initializes the attribute with the specified return value condition and a field or property member.</summary>
117
+ /// <param name="returnValue">
118
+ /// The return value condition. If the method returns this value, the associated parameter will not be null.
119
+ /// </param>
120
+ /// <param name="member">
121
+ /// The field or property member that is promised to be not-null.
122
+ /// </param>
123
+ public MemberNotNullWhenAttribute ( bool returnValue , string member )
124
+ {
125
+ ReturnValue = returnValue ;
126
+ Members = new [ ] { member } ;
127
+ }
128
+
129
+ /// <summary>Initializes the attribute with the specified return value condition and list of field and property members.</summary>
130
+ /// <param name="returnValue">
131
+ /// The return value condition. If the method returns this value, the associated parameter will not be null.
132
+ /// </param>
133
+ /// <param name="members">
134
+ /// The list of field and property members that are promised to be not-null.
135
+ /// </param>
136
+ public MemberNotNullWhenAttribute ( bool returnValue , params string [ ] members )
137
+ {
138
+ ReturnValue = returnValue ;
139
+ Members = members ;
140
+ }
141
+
142
+ /// <summary>Gets the return value condition.</summary>
143
+ public bool ReturnValue { get ; }
144
+
145
+ /// <summary>Gets field or property member names.</summary>
146
+ public string [ ] Members { get ; }
147
+ }
148
+ #endif
149
+ }
0 commit comments