C # 8.0 рдФрд░ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдореЗрдВ рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░

рдЪрд┐рддреНрд░ 9


рдпрд╣ рдХреЛрдИ рд░рд╣рд╕реНрдп рдирд╣реАрдВ рд╣реИ рдХрд┐ Microsoft рдХрд╛рдлреА рд╕рдордп рд╕реЗ C # рднрд╛рд╖рд╛ рдХреЗ 8-рд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдирдпрд╛ рднрд╛рд╖рд╛ рд╕рдВрд╕реНрдХрд░рдг (C # 8.0) рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2019 рдХреА рд╣рд╛рд▓рд┐рдпрд╛ рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрд▓рдмреНрдз рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдмреАрдЯрд╛ рдореЗрдВ рд╣реИред рдЗрд╕ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдХрд┐ рдХреБрдЫ рд╣рдж рддрдХ рдЧреИрд░-рд╕реНрдкрд╖реНрдЯ, рдпрд╛ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХреА рдЧрдИ рд╣реИрдВред рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╣реИрдВред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдирд▓ рд╕рдВрджрд░реНрдн рдЕрдкрд╡рд╛рдж (рдПрдирдЖрд░рдИ) рд╕реЗ рд▓рдбрд╝рдиреЗ рдХреЗ рд╕рд╛рдзрди рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХреА рдЧрдИ рд╣реИред

рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╛рд╖рд╛ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдФрд░ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИред рд╕рдВрдпреЛрдЧ рд╕реЗ, рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ, рд╣рдордиреЗ NRE рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП PVS-Studio рдХреЗ C # рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдХрд╛рдлреА рдмрдврд╝рд╛рдпрд╛ред рдФрд░ рдЕрдм рд╣рдо рд╕реЛрдЪ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдФрд░ рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдЕрднреА рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдЕрд╢рд╛рдВрддрд┐ рдХреЗ рдирд┐рджрд╛рди рдХреЗ рд▓рд┐рдП рдкрд░реЗрд╢рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдХрдо рд╕реЗ рдХрдо рдирдП рдХреЛрдб рдореЗрдВ рдЬреЛ рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реЛрдЧрд╛, рдРрд╕реЗ рдбреЗрд░реЗрдлреЗрд░ "рдЕрд╕рдВрднрд╡" рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ? рдЪрд▓реЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред

рдирдИ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖


рд╣рдорд╛рд░реЗ рдЬрд╛рд░реА рд░рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдЕрдиреБрд╕реНрдорд╛рд░рдХ: рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрд▓рдмреНрдз C # 8.0 рдХрд╛ рдирд╡реАрдирддрдо рдмреАрдЯрд╛ рд╕рдВрд╕реНрдХрд░рдг, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рдЕрдХреНрд╖рдо рд╣реИ, рдЕрд░реНрдерд╛рдд рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред

рдпрджрд┐ рд╣рдо рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВ рддреЛ C # 8.0 рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рд╣реИрдВ? рд╡реЗ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЕрдм рдЖрдкрдХреЛ 'рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛?' рдкреНрд░рдХрд╛рд░ рдирд╛рдо рдХреЗ рдмрд╛рдж (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдЯреНрд░рд┐рдВрдЧ? ), Nullable <T> рдХреЗ рд╕рдорд╛рди , рдЕрд░реНрдерд╛рддреН рдЕрд╢рдХреНрдд рдорд╛рди рдкреНрд░рдХрд╛рд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, int? )ред Without? тАЩрдХреЗ рдмрд┐рдирд╛, рд╣рдорд╛рд░реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рдХрд╛рд░ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЕрдм рдЧреИрд░- рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рдХреА рдЬрд╛рдПрдЧреА, рдЕрд░реНрдерд╛рддреН рдПрдХ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рдЬрд┐рд╕реЗ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рдЕрдкрд╡рд╛рдж рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рднрдпрд╛рд╡рд╣ рдЕрдкрд╡рд╛рджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрд╕рдХреЗ рд╕реНрд░реЛрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рдХрд╣рддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЕрдЧрд░ рдлреЗрдВрдХрдиреЗ рдХреА рд╡рд┐рдзрд┐ рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдХрдИ рд╕рд╛рд░реЗ рд╕рдВрдЪрд╛рд▓рди рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдПрдХ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдЪрд░ рдХреЗ рд▓рд┐рдП рдЕрд╢рдХреНрдд рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЛ рдирд┐рд╖рд┐рджреНрдз рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╢рд╛рдВрдд рджрд┐рдЦрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдПрдХ рд╡рд┐рдзрд┐ рд╕реЗ рдЕрд╢рдХреНрдд рдЧреБрдЬрд░рдиреЗ рдкрд░ рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреБрдЫ рдирд┐рд╖реНрдкрд╛рджрди рддрд░реНрдХ рд╣реИ? рдЕрд╢рдХреНрдд рдХреЗ рдмрдЬрд╛рдп, рд╣рдо, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╢рд╛рдмреНрджрд┐рдХ, рдПрдХ рд╕реНрдерд┐рд░, рдпрд╛ рдмрд╕ рдПрдХ "рдЕрд╕рдВрднрд╡" рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рдЪрд░ рдХреЛ рдХрд╣реАрдВ рдФрд░ рдирд╣реАрдВ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдХреНрд░реИрд╢ рдХреЛ "рдореВрдХ" рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЧрд▓рдд рдирд┐рд╖реНрдкрд╛рджрди, рдЬреЛ рдЕрдХреНрд╕рд░ рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рд╕реЗ рднреА рдмрджрддрд░ рд╣реЛрддрд╛ рд╣реИред

рдлрд┐рд░ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдХрд┐рд╕реА рд╕реНрдерд╛рди рдкрд░ рдлреЗрдВрдХрд╛ рдЧрдпрд╛ рдПрдХ рд╕рд╛рд░реНрдердХ рдЕрдкрд╡рд╛рдж рдЬрд╣рд╛рдБ рдХреБрдЫ рдЧрд▓рдд рд╣реБрдЖ рд╣рдореЗрд╢рд╛ рдПрдХ NRE рд╕реЗ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдвреЗрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рдЖрдкрдХреЗ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдЬрд╣рд╛рдБ рдЖрдк рдЙрдкрднреЛрдХреНрддрд╛рдУрдВ рдХреЛ рдЯреНрд░рд╛рдЗ -рдХреИрдЪ рдмреНрд▓реЙрдХ рдбрд╛рд▓рдХрд░ рд╕рд╣реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрдкрдХреА рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░реА рд╣реИред (рдЧреИрд░) рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдпрд╣ рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡рд┐рдзрд┐ рд╣рдореЗрд╢рд╛ рдПрдХ рдорд╛рди рд▓реМрдЯрд╛рддреА рд╣реИред рд╕рдм рдХреЗ рдмрд╛рдж, рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ (рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдЖрд╕рд╛рди) рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХреЛрдб рдореЗрдВ рднреА рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреЗ рд╕рд╛рде рдирд▓ рдХреА рд╡рд╛рдкрд╕реА рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЛрдб рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ)ред

Nullable Reference рдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реНрддрд░ рдкрд░ NullableContextOptions рдЧреБрдг рдорд╛рди рдХреЗ рд╕рд╛рде рдпрд╛ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд╝рд╛рдЗрд▓ рд╕реНрддрд░ рдкрд░ рдЬреЛрдбрд╝рдХрд░ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

#nullable enable string cantBeNull = string.Empty; string? canBeNull = null; cantBeNull = canBeNull!; 

рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рдмрдирд╛рдПрдЧреАред рд╡рд┐рдзрд┐ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ: рдпрджрд┐ рдЗрд╕рдХреА рдЕрд╢рдХреНрдд рдЬрд╛рдБрдЪ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдпрджрд┐ рдпрд╣ рдЕрд╢рдХреНрдд рд╣реЛ рд╕рдХрддреА рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЕрдм, рдЬрдм рдЖрдк рдЗрд╕реЗ рдЬрд╛рдВрдЪреЗ рдмрд┐рдирд╛ рдПрдХ рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрдХрд▓рдХ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдЬрд╛рд░реА рдХрд░реЗрдЧрд╛ред

рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЧреБрдорд░рд╛рд╣ рдХрд░рдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рднреА рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрднреА рднреА рдирдП рдЕрд╢рдХреНрдд-рдХреНрд╖рдорд╛рд╢реАрд▓ рдСрдкрд░реЗрдЯрд░ (!) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЕрд╢рдХреНрдд рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рд╣реИред рдЕрд░реНрдерд╛рддреН, рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╕реНрдордпрд╛рджрд┐рдмреЛрдзрдХ рдмрд┐рдВрджреБ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдФрд░ рдзрд╛рд░рдгрд╛рдПрдБ рдЯреВрдЯ рд╕рдХрддреА рд╣реИрдВ:

 #nullable enable String GetStr() { return _count > 0 ? _str : null!; } String str = GetStr(); var len = str.Length; 

рд╣рд╛рдВ, рдЖрдк рддрд░реНрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЦрд░рд╛рдм рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╣реИ рдФрд░ рдХреЛрдИ рднреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХреЛрдб рдирд╣реАрдВ рд▓рд┐рдЦреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЬрдм рддрдХ рдпрд╣ рд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЖрдк рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рддрд░реАрдХреЗ рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рджреНрд╡рд╛рд░рд╛ рд▓рдЧрд╛рдП рдЧрдП рдЕрдиреБрдмрдВрдз рдкрд░ рдХреЗрд╡рд▓ рд╕реБрд░рдХреНрд╖рд┐рдд рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ ( рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рдЕрд╢рдХреНрдд рдирд╣реАрдВ рд▓реМрдЯ рд╕рдХрддрд╛)ред

рд╡реИрд╕реЗ, рдЖрдк рдХрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╣реА рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ ! рдСрдкрд░реЗрдЯрд░, рдЬреИрд╕рд╛ рдХрд┐ C # рдЕрдм рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдФрд░ рдРрд╕рд╛ рдХреЛрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣реИ):

 cantBeNull = canBeNull!!!!!!!; 

рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрдХрд░, рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ, рд╡рд┐рдЪрд╛рд░ рдкрд░ рдЬреЛрд░ рджреЗрдВ, "рджреЗрдЦреЛ, рдпрд╣ рд╢реВрдиреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ !!!" (рд╣рдо рдЕрдкрдиреА рдЯреАрдо рдореЗрдВ, рд╣рдо рдЗрд╕реЗ "рднрд╛рд╡рдирд╛рддреНрдордХ" рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╣рддреЗ рд╣реИрдВ)ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рдкреЗрдбрд╝ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп, рдХрдВрдкрд╛рдЗрд▓рд░ (рд░реЛрдЬрд▓рд┐рди рд╕реЗ) рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ ! рдСрдкрд░реЗрдЯрд░ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЬреИрд╕реЗ рдпрд╣ рдирд┐рдпрдорд┐рдд рдХреЛрд╖реНрдардХ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдк рдХрдИ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ ! рдЖрдк рдХреА рддрд░рд╣ рдХреЗ рд░реВрдк рдореЗрдВ - рдЬреИрд╕реЗ рдХреЛрд╖реНрдардХ рдХреЗ рд╕рд╛рдеред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЙрдирдореЗрдВ рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕рдВрдХрд▓рдХ рдХреЛ "рдЦрдЯрдЦрдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ"ред рд╢рд╛рдпрдж рдпрд╣ C # 8.0 рдХреА рдЕрдВрддрд┐рдо рд░рд┐рд▓реАрдЬ рдореЗрдВ рддрдп рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕реА рддрд░рд╣, рдЖрдк рдмрд┐рдирд╛ рдЬрд╛рдВрдЪ рдХреЗ рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рдВрдХрд▓рдХ рдЪреЗрддрд╛рд╡рдиреА рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 canBeNull!.ToString(); 

рдЖрдЗрдП рдЕрдзрд┐рдХ рднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝реЗрдВ:

 canBeNull!!!?.ToString(); 

рдЖрдк рд╢рд╛рдпрдж рд╣реА рдХрднреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдореЗрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рддрд░рд╣ рджреЗрдЦреЗрдВрдЧреЗред рдирд▓-рдХреНрд╖рдорд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдСрдкрд░реЗрдЯрд░ рдХреЛ рд▓рд┐рдЦрдХрд░ рд╣рдо рд╕рдВрдХрд▓рдХ рдХреЛ рдмрддрд╛рддреЗ рд╣реИрдВ, "рдпрд╣ рдХреЛрдб рдареАрдХ рд╣реИ, рдЬрд╛рдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред" рдПрд▓реНрд╡рд┐рд╕ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рд╣рдо рдЗрд╕реЗ рдмрддрд╛рддреЗ рд╣реИрдВ, тАЬрдпрд╛ рд╢рд╛рдпрдж рдирд╣реАрдВ; рдЪрд▓реЛ рдЗрд╕реЗ рд╕рд┐рд░реНрдл рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрд╛рдВрдЪреЗрдВред "

рдЕрдм, рдЖрдк рдпрдереЛрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпреЛрдВ рдЖрдк рдЕрднреА рднреА рдЕрд╢рдХреНрдд рдЧреИрд░-рд╕рдВрджрд░реНрдн рдпреЛрдЧреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЪрд░ рдХреЛ рдЗрддрдиреА рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЗрди рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╣реБрдд рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдРрд╕реЗ рдЪрд░ рдХрд╛ рдореВрд▓реНрдп рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рд╣реИ рдХрд┐ "рд╣реБрдб рдХреЗ рдиреАрдЪреЗ", IL рдХреЛрдб рд╕реНрддрд░ рдкрд░, рд╣рдорд╛рд░рд╛ рдЧреИрд░-рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рдЕрднреА рднреА рд╣реИ ... рдЕрдЪреНрдЫрд╛ рдкреБрд░рд╛рдирд╛ "рдирд┐рдпрдорд┐рдд" рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░, рдФрд░ рд╕рдВрдкреВрд░реНрдг nullability рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдВрдХрд▓рдХ рдХреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдПрдиреЛрдЯреЗрд╢рди рд╣реИ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ (рдЬреЛ, рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ, рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдмрд╛рдж рдореЗрдВ рдЙрд╕ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реВрдВрдЧрд╛)ред рдирд┐рдЬреА рддреМрд░ рдкрд░, рд╣рдо рдирдП рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рддреГрддреАрдп-рдкрдХреНрд╖ рдЯреВрд▓ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдХреЗ рд▓рд┐рдП рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдПрдХ "рд╕рд╛рдл" рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдкрд╛рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдПрдиреЛрдЯреЗрд╢рди рд╣реИ рдЬреЛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЕрд╢рдХреНрдд рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдлрд┐рд░ рднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреЗ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдирд╛ред рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдХреНрд╖рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреА рд╣реИрдВ, рдПрдХ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдЪрд░ рдХреЛ рдкрд╛рд░ рдХрд░рддреЗ рд╣реБрдП, рдХрд╣рддреЗ рд╣реИрдВ, рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдПрдХ рд╡рд┐рдзрд┐ рдореЗрдВ рдШреЛрд╖рд┐рдд рд╡рд┐рдзрд┐ рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдореЗрдВ NullableContext рд╣реИ рд╕рдВрдХрд▓рдХ рдорд╛рди рд░рд╣рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрд╢рдХреНрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рд╕рдВрдХрд▓рдХ рдЪреБрдк рд░рд╣реЗрдЧрд╛ред рдФрд░ рдпрд╣ рд╣реИ рдХрд┐ [рдЕрд╢рдХреНрдд (1)] рдЯрди рдХреЗ рдмрд╛рд╡рдЬреВрдж Nullable рд╕рдиреНрджрд░реНрдн рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реБрдП IL рдХреЛрдб рдореЗрдВ рд╣рд░ рдХреНрд╖реЗрддреНрд░ рдФрд░ рдкрджреНрдзрддрд┐ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдЬреЛрдбрд╝реА рдЧрдИ рд╣реИрдВ ред рдпрджрд┐ рдЖрдк рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдб рдореЗрдВ рдХреЗрд╡рд▓ рдЖрдкрдХреЗ рдХрд╕реНрдЯрдо рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рддреЛ рдЗрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рд╢реИрд▓реА рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝реЗ рдХреЛрдб рдЖрдзрд╛рд░ рдХреЛ рдЕрдкрдирд╛рдиреЗ рдкрд░ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд░реЗрд╢рд╛рдиреА рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддреА рд╣реИред рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдВрднрд╡рддрдГ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдЪрд▓ рд░рд╣реА рд╣реЛрдЧреА, рдкрд░рд┐рдпреЛрдЬрдирд╛ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ред рдпрджрд┐ рдЖрдк рд╕рд╛рд╡рдзрд╛рди рд╣реИрдВ, рддреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЖрдк рдзреАрд░реЗ-рдзреАрд░реЗ рдирдИ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рдкрд░рд┐рд╡рд░реНрддрди рдЦрддрд░рдирд╛рдХ рдФрд░ рдЕрд╡рд╛рдВрдЫрдиреАрдп рд╣реИрдВ (рдпрджрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рд╕реНрдкрд░реНрд╢ рди рдХрд░реЗрдВ!)ред рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ PVS-Studio рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕рдВрднрд╛рд╡рд┐рдд рдПрдирдЖрд░рдИ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдпрд╛ рдЗрд╕реЗ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЙрди рд╕реНрдерд╛рдиреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдПрдХ NullReferenceException рдХреЛ рдлреЗрдВрдХ рд╕рдХрддреЗ рд╣реИрдВ , рдмрд╕ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЪрд▓рд╛рдПрдВ рдФрд░ V3080 рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреЛ рджреЗрдЦреЗрдВред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЧреБрдгреЛрдВ рдпрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдирд┐рд░реНрджреЗрд╢, рдЧреБрдг рдпрд╛ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╡рд┐рд░рд╛рд╕рдд рдХреЛрдб рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рддреЗ рд╕рдордп, рд╣рдореЗрдВ рдпрд╣ рддрдп рдХрд░рдирд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЛ рдпрд╣ рдорд╛рди рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЧреИрд░-рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЪрд░ рдореЗрдВ рд╣рдореЗрд╢рд╛ рдЕрд╢рдХреНрдд рдорд╛рди рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕ рдЧрд╛рд░рдВрдЯреА рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдордиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЛ рдРрд╕реА рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рдмрдирд╛рдиреА рдЪрд╛рд╣рд┐рдПред рдЖрдЦрд┐рд░рдХрд╛рд░, рднрд▓реЗ рд╣реА рдХреЛрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рднреА рддрд░рд╣ рд╕реЗ рдЧреИрд░-рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЙрди рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдХрд░ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдРрд╕реЗ рдЪрд░ рдХрд╛ рдореВрд▓реНрдп рд╢реВрдиреНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ


рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рд╕реА # рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдореЗрдВ рдбреЗрдЯрд╛рдлреНрд▓реЛ рддрдВрддреНрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдЪрд░ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдЗрдВрдЯрд░рдкреНрд░реЛрдбреЗрдХреНрдЯрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЕрд░реНрдерд╛рдд рдПрдХ рд╡рд┐рдзрд┐ рдФрд░ рдЗрд╕рдХреЗ рдиреЗрд╕реНрдЯреЗрдб рддрд░реАрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдЙрди рдЪрд░реЛрдВ рдХреЛ рдпрд╛рдж рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╢реВрдиреНрдп рдорд╛рди рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬрдм рднреА рдРрд╕рд╛ рдХреЛрдИ рд╡реИрд░рд┐рдПрдмрд▓ рдЪреЗрдХ рдХреЗ рдмрд┐рдирд╛ рдбрд┐рд░реЗрд▓ рд╣реЛрддрд╛ рд╣реБрдЖ рджрд┐рдЦрддрд╛ рд╣реИ, рдЪрд╛рд╣реЗ рд╡рд╣ рд╡рд░реНрддрдорд╛рди рдХреЛрдб рдореЗрдВ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рддрд╣рдд рд╣реЛ, рдпрд╛ рдЗрд╕ рдХреЛрдб рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░, рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд Null рд╕рдВрджрд░реНрдн рдЕрдкрд╡рд╛рдж рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ V3080 рдЪреЗрддрд╛рд╡рдиреА рдЬрд╛рд░реА рдХрд░реЗрдЧрд╛ред

рдЗрд╕ рдирд┐рджрд╛рди рдХреЗ рдкреАрдЫреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЛ рдЧреБрд╕реНрд╕рд╛ рддрднреА рдЖрддрд╛ рд╣реИ рдЬрдм рд╡рд╣ рдПрдХ рдЕрд╢рдХреНрдд рдХрд╛рдо рджреЗрдЦрддрд╛ рд╣реИред рдпрд╣ рд╕рдВрдХрд▓рдХ рдХреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╕реЗ рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рд╡рд╛рд▓реЗ рд╣рдорд╛рд░реЗ рдиреИрджрд╛рдирд┐рдХ тАЛтАЛрд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдореБрдЦреНрдп рдЕрдВрддрд░ рд╣реИред рдмрд┐рд▓реНрдЯ-рдЗрди рдПрдирд╛рд▓рд╛рдЗрдЬрд╝рд░ рдПрдХ-рдПрдХ рдЕрдирдЪрд╛рд╣реЗ рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рдЪрд░ рдХреЗ рд╣рд░ рдмрд┐рдВрджреБ рдкрд░ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ - рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЧреБрдорд░рд╛рд╣ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ! рдСрдкрд░реЗрдЯрд░ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рд┐рд░реНрдл рдПрдХ рдЬрдЯрд┐рд▓ рдЬрд╛рдВрдЪ (рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрд┐ рдмрд┐рд▓реНрдХреБрд▓ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ, рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдХрд╛ рдпрд╣рд╛рдВ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реИ, рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреЛ "рдЧреБрдорд░рд╛рд╣" рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рдЖрдк рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд░рдЦрддреЗ рд╣реИрдВ)ред

рджреВрд╕рд░реА рдУрд░, рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рддрднреА рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реИ, рдЬрдм рд╡рд╣ рдПрдХ рдЕрд╢рдХреНрдд (рдЪрд╛рд╣реЗ рд╕реНрдерд╛рдиреАрдп рд╕рдВрджрд░реНрдн рдХреЗ рднреАрддрд░ рдпрд╛ рдмрд╛рд╣рд░ рдХреА рд╡рд┐рдзрд┐ рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реЛ)ред рднрд▓реЗ рд╣реА рдЪрд░ рдПрдХ рдЧреИрд░- рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛ, рдЕрдЧрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЙрд╕ рдЪрд░ рдХреЛ рдПрдХ рдЕрд╢рдХреНрдд рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рджреЗрдЦрддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд░рд╣реЗрдЧрд╛ред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг, рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ, рдпрд╣ рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реИ (рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ) рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рдЬрд╛рдВрдЪ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╢рдХреНрдд рдЬрд╛рдБрдЪ рдХреЗ рд╕рд╛рде рдкреВрд░реЗ рдХреЛрдб рдХреА "рд╕реНрдореАрдпрд░рд┐рдВрдЧ" рдХреА рдорд╛рдВрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рдЖрдЦрд┐рд░рдХрд╛рд░, рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рд╕реЗ рдкрд╣рд▓реЗ рднреА рдЙрдкрд▓рдмреНрдз рдерд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдиреБрдмрдВрдзреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреЗрд╢ рдХрд┐рдП рдЧрдП рдереЗред рдХреНрдпрд╛ рдЕрдзрд┐рдХ рд╣реИ, рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЕрдм рдЧреИрд░-рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рдЪрд░ рдкрд░ рдмреЗрд╣рддрд░ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ "рдирд┐рд╖реНрдкрдХреНрд╖ рд░реВрдк рд╕реЗ" рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХрднреА рднреА рдирд┐рд░рд░реНрдердХ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдПрдХ рд╢рдмреНрдж рдирд╣реАрдВ рдХрд╣реЗрдЧрд╛ред рдпрджрд┐ рдЪрд░ рдХреЛ рдмрд┐рдирд╛ рдкреВрд░реНрд╡ рдЬрд╛рдВрдЪ рдХреЗ рдирд┐рд░рд╕реНрдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ PVS-Studio рдПрдХ V3080 рдЪреЗрддрд╛рд╡рдиреА рдЬрд╛рд░реА рдХрд░реЗрдЧрд╛:

 #nullable enable String GetStr() { return _count > 0 ? _str : null!; } String str = GetStr(); var len = str.Length; <== V3080: Possible null dereference. Consider inspecting 'str' 

рдЕрдм рдЖрдЗрдП рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдирд┐рджрд╛рди рдХреИрд╕реЗ рд░реЛрдЬрд╝рд▓рд┐рди рдХреЗ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдордиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдкрд╣рд▓реЗ рд╣реА рдЬрд╛рдБрдЪ рдХрд░ рд▓реА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░ рд╣рдо рдХреЗрд╡рд▓ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╕рдВрднрд╛рд╡рд┐рдд рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВред рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рд╕рдВрднрд╛рд╡рд┐рдд рдПрдирдЖрд░рдИ рдХрд╛ рдХреИрд╕реЗ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдирдП рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреИрд╕реЗ рддрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

V3080 [CWE-476] рд╕рдВрднрд╡ рд╢реВрдиреНрдп рд╡рд┐рдзреНрд╡рдВрд╕ рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ред 2 рддрд░реНрдХ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: chainedTupleTypeред Microsoft.CodeAnalysis.CSharp TupleTypeSymbol.cs 244

 NamedTypeSymbol chainedTupleType; if (_underlyingType.Arity < TupleTypeSymbol.RestPosition) { .... chainedTupleType = null; } else { .... } return Create(ConstructTupleUnderlyingType(firstTupleType, chainedTupleType, newElementTypes), elementNames: _elementNames); 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, chainedTupleType рдЪрд░ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рд╢рд╛рдЦрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рд╢реВрдиреНрдп рдорд╛рди рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рддрдм ConstructTupleUnderlyingType рд╡рд┐рдзрд┐ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдбреАрдмрдЧ рдХреЗ рдмрд╛рдж рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд░реЛрд╕рд▓рд┐рди рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рд╣реИ, рд▓реЗрдХрд┐рди рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рд░рд┐рд▓реАрдЬ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдбреЗрдмреНрдпреВ.рдПрд╕рд░реНрд╕ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЕрднреА рднреА ConstructTupleUnderlyingType рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ рдХреЗ рд╡рд┐рдЪрд▓рди рдХреЛ рдЦрддрд░рдирд╛рдХ рдорд╛рдирддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдЙрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рд╢рд░реАрд░ рд╣реИ, рдЬрд╣рд╛рдБ рдкрд░ рд╕реНрдердЧрди рд╣реЛрддрд╛ рд╣реИ:

 internal static NamedTypeSymbol ConstructTupleUnderlyingType( NamedTypeSymbol firstTupleType, NamedTypeSymbol chainedTupleTypeOpt, ImmutableArray<TypeWithAnnotations> elementTypes) { Debug.Assert (chainedTupleTypeOpt is null == elementTypes.Length < RestPosition); .... while (loop > 0) { .... currentSymbol = chainedTupleTypeOpt.Construct(chainedTypes); loop--; } return currentSymbol; } 

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рд╡рд╛рдж рдХрд╛ рд╡рд┐рд╖рдп рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдПрдирд╛рд▓рд╛рдЗрдЬрд░ рдХреЛ рдПрд╕реЗрд░реНрдЯреНрд╕ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП (рд╣рдорд╛рд░реЗ рдХреБрдЫ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдРрд╕рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ) - рдЖрдЦрд┐рд░рдХрд╛рд░, рдПрдирд╛рд▓рд╛рдЗрдЬрд░ System.Diagnostics.Contracts рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдЕрдиреБрдмрдВрдз рд▓реЗрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рд╣рдорд╛рд░реЗ рдЕрдкрдиреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдореЗрдВ рд░реЛрдЬрд╝рд▓рд┐рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╣рдорд╛рд░реЗ рдЕрдиреБрднрд╡ рд╕реЗ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рддреЗ рд╣реБрдП, рд╣рдордиреЗ рд░реЛрдЬрд▓рд┐рди рдХреЛ рдЗрд╕рдХреЗ рддреАрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рднреА рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ред рдЙрд╕рдХреЗ рдмрд╛рдж, рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдиреЗ рдХреБрдЫ рдирд┐рд╢реНрдЪрд┐рдд рдХреЛрдб рдХреЛ рдХреНрд░реИрд╢ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛, рдЬреЛ рдкрд╣рд▓реЗ рдХрднреА рдХреНрд░реИрд╢ рдирд╣реАрдВ рд╣реБрдЖ рдерд╛ред рдПрдХ рдирд╛рд▓ рд╕рдВрджрд░реНрдн рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рджреБрд░реНрдШрдЯрдирд╛, рд╣рдорд╛рд░реЗ рдХреЛрдб рдореЗрдВ рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рд░реЛрдЬрд▓рд┐рди рдХреЗ рдХреЛрдб рдореЗрдВ рд╣реЛрдЧреАред рдбреЗрдмрдЧрд┐рдВрдЧ рдиреЗ рдЦреБрд▓рд╛рд╕рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдХреЛрдбрд┐рди рдЬрд╣рд╛рдВ рд░реЛрд╕рд▓рд┐рди рдЕрдм рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рд░рд╣рд╛ рдерд╛, рд╡рд╣ рдмрд╣реБрдд рддрд░рд╣ рдХрд╛ рдбреЗрдмреНрдпреВ рдерд╛ред рд╢реЛрдзрдХрд░реНрддрд╛ рдЖрдзрд╛рд░рд┐рдд рдирд▓ рдХрдИ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЙрдЪреНрдЪрддрд░ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ - рдФрд░ рдпрд╣ рдЬрд╛рдВрдЪ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдорджрдж рдирд╣реАрдВ рдХрд░рддреА рд╣реИред

рдпрд╣ рдПрдХ рдЧреНрд░рд╛рдлрд┐рдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдЖрдк рдбрд┐рдмрдЧ рдХрд╛ рдЗрд▓рд╛рдЬ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рдиреБрд▓реНрд▓реЗ рд░реЗрдлрд░рдмреЗрдХреНрдпреВрдЬрд╝ рд╕реЗ рдкрд░реЗрд╢рд╛рдиреА рдореЗрдВ рдкрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк #nullable enable рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ chainedTupleTypeOpt рддрд░реНрдХ рдХреЛ рдПрдХ рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВ , рддреЛ рд╕рдВрдХрд▓рдХ ConstructTupleUnderlyingType рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ рдбреЗрд░реЗрдлреЗрд░реЗрд╢рди рдкрд░ рдХреЛрдИ рдЪреЗрддрд╛рд╡рдиреА рдЬрд╛рд░реА рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рджреНрд╡рд╛рд░рд╛ рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреЗ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рдЪрд▓рддреЗ рд╣реБрдПред

V3080 рд╕рдВрднрд╡ рдЕрд╢рдХреНрддрддрд╛ред рдирд┐рд░реАрдХреНрд╖рдг 'рдкреНрд░рднрд╛рд╡реАRuleset' рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред RuleSet.cs 146

 var effectiveRuleset = ruleSet.GetEffectiveRuleSet(includedRulesetPaths); effectiveRuleset = effectiveRuleset.WithEffectiveAction(ruleSetInclude.Action); if (IsStricterThan(effectiveRuleset.GeneralDiagnosticOption, ....)) effectiveGeneralOption = effectiveRuleset.GeneralDiagnosticOption; 

рдпрд╣ рдЪреЗрддрд╛рд╡рдиреА рдХрд╣рддреА рд╣реИ рдХрд┐ WithEffectiveAction рдкрджреНрдзрддрд┐ рдХреА рдХреЙрд▓ рдЕрд╢рдХреНрдд рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬрдмрдХрд┐ рдЪрд░ рдкреНрд░рднрд╛рд╡реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд░рд┐рдЯрд░реНрди рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЬрд╛рдБрдЪ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ ( рдкреНрд░рднрд╛рд╡реА Ruleset.GeneralDiagnosticOption )ред рдпрд╣рд╛рдБ рдирд┐рдХрд╛рдп рд╡рд┐рдЪрд▓рди рд╡рд┐рдзрд┐ рдХрд╛ рдЕрдВрдЧ рд╣реИ:

 public RuleSet WithEffectiveAction(ReportDiagnostic action) { if (!_includes.IsEmpty) throw new ArgumentException(....); switch (action) { case ReportDiagnostic.Default: return this; case ReportDiagnostic.Suppress: return null; .... return new RuleSet(....); default: return null; } } 

рд╡рд┐рдзрд┐ GetEffectiveRuleSet рдХреЗ рд▓рд┐рдП рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ рджреЛ рд╕реНрдерд╛рди рдорд┐рд▓реЗрдВрдЧреЗ рдЬрд╣рд╛рдВ рдХреЛрдб рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред рдЪреВрдБрдХрд┐ рдКрдкрд░ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рддрд░реАрдХрд╛ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдорд╛рди рд▓реЗрдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдЯреНрд░рд╛рдЗ -рдХреИрдЪ рдмреНрд▓реЙрдХ рдореЗрдВ рд▓рдкреЗрдЯреА рдЧрдИ рд╣реИ рдФрд░ рд░рд┐рдЯрд░реНрди рдирд▓ рдХреЗ рдмрдЬрд╛рдп рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХрдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╕рд╣реА рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдЖрдк рдХреБрдЫ рдХреЙрд▓ рдХреЛ рд╡рд╛рдкрд╕ рдЯреНрд░реЗрд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреИрдЪрд┐рдВрдЧ рдХреЛрдб рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рджреВрд░ рд╣реИред рдЖрдЗрдП рдкреНрд░рднрд╛рд╡реАрдЯреНрд░реВрд╕реЗрдЯ рдЪрд░ рдХреЗ рдЙрдкрднреЛрдХреНрддрд╛ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ, IsStricterThan рд╡рд┐рдзрд┐:

 private static bool IsStricterThan(ReportDiagnostic action1, ReportDiagnostic action2) { switch (action2) { case ReportDiagnostic.Suppress: ....; case ReportDiagnostic.Warn: return action1 == ReportDiagnostic.Error; case ReportDiagnostic.Error: return false; default: return false; } } 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рджреЛ рд╕рд░рд▓рддрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдЪрдпрди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реНрд╡рд┐рдЪ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд╣реИ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ ReportDiagnostic.Default ред рдЗрд╕рд▓рд┐рдП рдХреЙрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛:

WithEffectiveAction рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛:

 #nullable enable public RuleSet? WithEffectiveAction(ReportDiagnostic action) 

рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреЙрд▓ рд▓рдЧреЗрдЧрд╛:

 RuleSet? effectiveRuleset = ruleSet.GetEffectiveRuleSet(includedRulesetPaths); effectiveRuleset = effectiveRuleset?.WithEffectiveAction(ruleSetInclude.Action); if (IsStricterThan(effectiveRuleset?.GeneralDiagnosticOption ?? ReportDiagnostic.Default, effectiveGeneralOption)) effectiveGeneralOption = effectiveRuleset.GeneralDiagnosticOption; 

рдЪреВрдВрдХрд┐ IsStricterThan рдХреЗрд╡рд▓ рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рд╛рд▓рдд рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:

 if (effectiveRuleset == null || IsStricterThan(effectiveRuleset.GeneralDiagnosticOption, effectiveGeneralOption)) 

рдЕрдЧрд▓рд╛ рдЙрджрд╛рд╣рд░рдгред

V3080 рд╕рдВрднрд╡ рдЕрд╢рдХреНрддрддрд╛ред 'рдкреНрд░реЙрдкрд░реНрдЯреАрд╕рдВрдмреЙрд▓' рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред BinderFactory.BinderFactoryVisitor.cs 372

 var propertySymbol = GetPropertySymbol(parent, resultBinder); var accessor = propertySymbol.GetMethod; if ((object)accessor != null) resultBinder = new InMethodBinder(accessor, resultBinder); 

рдЗрд╕ рдЪреЗрддрд╛рд╡рдиреА рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдЖрдЧреЗ рдкреНрд░реЙрдкрд░реНрдЯреАрдмреЙрд▓ рд╡реИрд░рд┐рдПрдмрд▓ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред

 private SourcePropertySymbol GetPropertySymbol( BasePropertyDeclarationSyntax basePropertyDeclarationSyntax, Binder outerBinder) { .... NamedTypeSymbol container = GetContainerType(outerBinder, basePropertyDeclarationSyntax); if ((object)container == null) return null; .... return (SourcePropertySymbol)GetMemberSymbol(propertyName, basePropertyDeclarationSyntax.Span, container, SymbolKind.Property); } 

GetMemberSymbol рд╡рд┐рдзрд┐, рднреА, рдХреБрдЫ рд╢рд░реНрддреЛрдВ рдХреЗ рддрд╣рдд рдЕрд╢рдХреНрдд рд▓реМрдЯрд╛ рд╕рдХрддреА рд╣реИред

 private Symbol GetMemberSymbol( string memberName, TextSpan memberSpan, NamedTypeSymbol container, SymbolKind kind) { foreach (Symbol sym in container.GetMembers(memberName)) { if (sym.Kind != kind) continue; if (sym.Kind == SymbolKind.Method) { .... var implementation = ((MethodSymbol)sym).PartialImplementationPart; if ((object)implementation != null) if (InSpan(implementation.Locations[0], this.syntaxTree, memberSpan)) return implementation; } else if (InSpan(sym.Locations, this.syntaxTree, memberSpan)) return sym; } return null; } 

рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде, рдХреЙрд▓ рдЗрд╕рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдЧреА:

 #nullable enable SourcePropertySymbol? propertySymbol = GetPropertySymbol(parent, resultBinder); MethodSymbol? accessor = propertySymbol?.GetMethod; if ((object)accessor != null) resultBinder = new InMethodBinder(accessor, resultBinder); 

рдпрд╣ рдареАрдХ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ рдЬрдм рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрд╣рд╛рдБ рджреЗрдЦрдирд╛ рд╣реИред рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЗрд╕ рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рднреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЙрд▓ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕реЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдХреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреНрд░рдпрд╛рд╕ рдХреЗ рдкрдХрдбрд╝ рд╕рдХрддрд╛ рд╣реИред

V3080 рд╕рдВрднрд╡ рдЕрд╢рдХреНрддрддрд╛ред 'SimpleName' рдХреЗ рдирд┐рд░реАрдХреНрд╖рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред CSharpCommandLineParser.cs 1556

 string simpleName; simpleName = PathUtilities.RemoveExtension( PathUtilities.GetFileName(sourceFiles.FirstOrDefault().Path)); outputFileName = simpleName + outputKind.GetDefaultExtension(); if (simpleName.Length == 0 && !outputKind.IsNetModule()) .... 

рд╕рдорд╕реНрдпрд╛ simpleName.Length рдЬрд╛рдБрдЪ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ ред рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╕рд░рд▓ рдирд╛рдо рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдПрдХ рд▓рдВрдмреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдирд┐рд░рд░реНрдердХ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡реИрд╕реЗ, рдпрджрд┐ рдЖрдк рдЙрддреНрд╕реБрдХ рд╣реИрдВ, рддреЛ рдЖрдк рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП RemoveExtension рд╡рд┐рдзрд┐ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ Path.GetFileNameWithoutExtension рд╕реЗ рдХреИрд╕реЗ рднрд┐рдиреНрди рд╣реИ ред рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдирд╛рдо! = рдЕрд╢рдХреНрдд рдЪреЗрдХ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЧреИрд░- рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде, рдХреЛрдб рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛:

 #nullable enable public static string? RemoveExtension(string path) { .... } string simpleName; 

рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреЙрд▓ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ:

 simpleName = PathUtilities.RemoveExtension( PathUtilities.GetFileName(sourceFiles.FirstOrDefault().Path)) ?? String.Empty; 

рдирд┐рд╖реНрдХрд░реНрд╖


рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдбрд┐рдЬрд╛рдЗрди рдХрд░рддреЗ рд╕рдордп рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рдПрдХ рдмрдбрд╝реА рдорджрдж рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рдмрд╣реБрдд рд╕рдордп рдФрд░ рджреЗрдЦрднрд╛рд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рдХрдИ рдорд╛рдпрд╛рд╡реА рдХреАрдбрд╝реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд▓реЗрдЦ рдЖрдкрдХреЛ рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд▓рдХреНрд╖реНрдп рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИред рд╣рдореЗрдВ рдпрд╣ рдирдИ рд╕реБрд╡рд┐рдзрд╛ рдЖрдо рддреМрд░ рдкрд░ рдЙрдкрдпреЛрдЧреА рд▓рдЧрддреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рд╕реАрдорд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдореЗрд╢рд╛ рдпрд╛рдж рд░рдЦреЗрдВ рдФрд░ рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ Nullable Reference mode рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдирд╛ рдЖрдкрдХреЛ NRE рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рд╣реЛрдиреЗ рдкрд░, рдпрд╣ рд╕реНрд╡рдпрдВ рдЗрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рд╕реНрд░реЛрдд рдмрди рд╕рдХрддрд╛ рд╣реИред рд╣рдо рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдПрдХ рдЖрдзреБрдирд┐рдХ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЙрдкрдХрд░рдг, рдЬреИрд╕реЗ рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ, рдХреЗ рд╕рд╛рде рдЕрд╢рдХреНрдд рд╕рдВрджрд░реНрдн рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдкреВрд░рдХ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдирдЖрд░рдИ рд╕реЗ рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдкреНрд░реЛрдбреЗрдХреНрдЯреЛрд░рд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг - рдЧрд╣рди рдЗрдВрдЯрд░рдкреНрд░реЛрдбреЗрдХреНрдЯреЛрд░рд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рдПрдиреЛрдЯреЗрдЯрд┐рдВрдЧ рдореЗрдердб рд╕рд┐рдЧреНрдиреЗрдЪрд░ (рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд▓рдмрд▓ рд░реЗрдлрд░реЗрдВрд╕ рдореЛрдб рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ) - рдЙрдирдХреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖реЛрдВ рдХреЗ рдкрд╛рд╕ рд╣реИред рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЖрдкрдХреЛ рд╕рдВрднрд╛рд╡рд┐рдд рдЦрддрд░рдирд╛рдХ рд╕реНрдерд╛рдиреЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ рдФрд░ рдЖрдкрдХреЛ рдореМрдЬреВрджрд╛ рдХреЛрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо рджреЗрдЧрд╛ред рдпрджрд┐ рдХрд╣реАрдВ рдЕрд╢рдХреНрдд рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╣реИ, рддреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрднреЛрдХреНрддрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛, рдЬрд╣рд╛рдВ рдпрд╣ рдЪреЗрдХ рдХреЗ рдмрд┐рдирд╛ рдбреАрд░реЗрдлрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЖрдк рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдпрд╛ рдЕрдиреНрдп рджреЛрд╖реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдЦреБрдж рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдмрд╕ рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдПрдВред

Source: https://habr.com/ru/post/hi455234/


All Articles