
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд░реВрд╕реА рдореЗрдВ рд╢реБрд░реВ рд╣реБрдИ рдХреБрд░реВрдкрддрд╛ рдХреЗ рдирд╛рдо рдХрд╛ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рдерд╛ред рдореБрдЭреЗ рдпрд╣ рдЬрд╛рдирдХрд░ рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ рдХрд┐ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ MSDN рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг "рдЬреЗрдирд░рд┐рдХ" "рдЯреЗрдореНрдкрд▓реЗрдЯ" ( C++
рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рдорд╛рди, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ) рдХрд╣рддрд╛ рд╣реИред C#
рдорд╛рдзреНрдпрдо рд╕реЗ "CLR
рдХреЗ рдЪреМрдереЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ C#
рдЬрд┐рд╕рдиреЗ рдореБрдЭреЗ рдорд╛рд░рд╛ , рдкреАрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╡рд╛рджрд┐рдд рдЬреЗрдлрд░реА рд░рд┐рдХреНрдЯрд░ , рдЬреЗрдиреЗрд░рд┐рдХ рдХреЛ "рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рд╕рд╛рд░ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдпрд╣ рд▓реЗрдЦ C#
рдореЗрдВ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдЧрдгрд┐рддреАрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдЧрд╛ред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ C#
рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рдирд╣реАрдВ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдпрд╣ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдХреНрд╖рдо рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдорд╛рди C/C++
рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИ), BCL
рдореЗрдВ рдЧрдгрд┐рддреАрдп рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рдирд╣реАрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЗрдП C#
рдФрд░ CLR
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди
рдбрд┐рд╕реНрдХреНрд▓реЗрдорд░ : рд▓реЗрдЦ рдореЗрдВ рдХрдИ рдХреЛрдб рдЕрдВрд╢ рд╣реЛрдВрдЧреЗ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдореИрдВ рдПрдВрдбреНрд░реА рд╢реЗрдХрд┐рди рджреНрд╡рд╛рд░рд╛ рдЕрджреНрднреБрдд рд╕рдВрд╕рд╛рдзрди рд╢рд╛рд░реНрдкрд▓реИрдм ( Gi r tHub ) рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдЪрд┐рддреНрд░рд┐рдд рдХрд░реВрдВрдЧрд╛ ред
рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЧрдгрдирд╛ рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЧрдгрдирд╛ рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдмрд╛рд▓рддреА рд╣реИред рдЬреЛрдбрд╝, рдШрдЯрд╛рд╡ (рд╡реНрдпреБрддреНрдХреНрд░рдо, рдЛрдгрд╛рддреНрдордХ), рдЧреБрдгрди рдФрд░ рд╡рд┐рднрд╛рдЬрди рдХреЛ рд╕рдорд╛рдирддрд╛ рдХреЗ рд▓рд┐рдП рддреБрд▓рдирд╛ рдФрд░ рдЬрд╛рдБрдЪ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рджреНрд╡рд╛рд░рд╛ рдкреВрд░рдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдЗрди рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдФрд░ рдХрд┐рд╕реА рднреА рдореВрд▓ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдкреНрд░рдХрд╛рд░ рдХреЗ C#
рдЪрд░ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХрдорд╛рддреНрд░ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ C#
рдХреЛ рдЙрд╕ рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рдВрдЪрд╛рд▓рди рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╡рд┐рдзрд┐ рд▓рд┐рдЦрдирд╛ рдЬреЛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ (рдФрд░ рдкрд╛рд░рджрд░реНрд╢реА рд░реВрдк рд╕реЗ) рджреЛ рдкреВрд░реНрдгрд╛рдВрдХ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ рджреЛ рдлрд╝реНрд▓реЛрдЯрд┐рдВрдЧ-рдкреЙрдЗрдВрдЯ рдирдВрдмрд░ рдЕрд╕рдВрднрд╡ рд╣реИред
рдЖрдЗрдП рдХреБрдЫ рд╕рд╛рдзрд╛рд░рдг рдЧрдгрд┐рддреАрдп рдХреНрд░рд┐рдпрд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рдЗрдЪреНрдЫрд╛рдУрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ:
- рдПрдХ рд╡рд┐рдзрд┐ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рддрд┐рдмрдВрдз рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╣рдореЗрдВ рджреЛ рдордирдорд╛рдиреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ (рдпрд╛ рдЧреБрдгрд╛, рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ) рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрд╛рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рдмрд╛рдзрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
- рдкреНрд░рдпреЛрдЧ рдХреА рд╢реБрджреНрдзрддрд╛ рдХреЗ рд▓рд┐рдП, рд╕реНрд╡реАрдХреГрдд рдФрд░ рд▓реМрдЯреЗ рдкреНрд░рдХрд╛рд░ рд╕рдорд╛рди рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдмрд╛рдЗрдирд░реА рдСрдкрд░реЗрдЯрд░ рдХреЗ рдкрд╛рд╕ рдлреЙрд░реНрдо
(T, T) => T
рдХрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (T, T) => T
- рд╡рд┐рдзрд┐ рдХрдо рд╕реЗ рдХрдо рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд░реНрд╡рд╡реНрдпрд╛рдкреА рдореБрдХреНрдХреЗрдмрд╛рдЬреА рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред
рдФрд░ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
рдЖрдЗрдП F#
ред рдореИрдВ F#
рдореЗрдВ рдордЬрдмреВрдд рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЬреНрдпрд╛рджрд╛рддрд░ C#
рдкреНрд░рддрд┐рдмрдВрдз CLR
рд╕реАрдорд╛рдУрдВ рд╕реЗ рддрдп рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ F#
рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдЧреНрд░рд╕реНрдд рд╣реИред рдЖрдк рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдЬреЛрдбрд╝ рд╡рд┐рдзрд┐ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдЬреЛрдбрд╝ рд╡рд┐рдзрд┐ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ F#
рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдиреБрдорд╛рди рдкреНрд░рдгрд╛рд▓реА рдХреНрдпрд╛ рдХрд╣рддреА рд╣реИ:
let add_gen (x : 'a) (y : 'a) = x + y let add xy = x + y add_gen 5.0 6.0 |> ignore add 5.0 6.0 |> ignore
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рджреЛрдиреЛрдВ рд╡рд┐рдзрд┐рдпрд╛рдБ рдЧреИрд░-рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╣реЛ рдЬрд╛рдПрдВрдЧреА, рдФрд░ рдЙрддреНрдкрдиреНрди рдХреЛрдб рд╕рдорд╛рди рд╣реЛрдЧрд╛ред F#
рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдХреА рдХрдареЛрд░рддрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЬрд╣рд╛рдВ рдлрд╛рд░реНрдо рдХреЗ рдХреЛрдИ рдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рдирд╣реАрдВ рд╣реИрдВ int -> double
, рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдкрд╣рд▓реЗ рдХреЙрд▓ рдХреЗ рдмрд╛рдж double
рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде ( C#
рд╢рд░реНрддреЛрдВ рдореЗрдВ), рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рд╡рд┐рдзрд┐рдпреЛрдВ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЯрд╛рдЗрдк рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рдХрд╛рд░рдг рд╕рдЯреАрдХрддрд╛ рдХреА рд╕рдВрднрд╛рд╡рд┐рдд рд╣рд╛рдирд┐ рдХреЗ рд╕рд╛рде) рдЕрдзрд┐рдХ рдЕрд╕рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк +
рдСрдкрд░реЗрдЯрд░ рдХреЛ рд╕рдорд╛рдирддрд╛ рдСрдкрд░реЗрдЯрд░ =
рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЪрд┐рддреНрд░ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ : рджреЛрдиреЛрдВ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд ( C#
рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ) рдореЗрдВ рдмрджрд▓ рдЬрд╛рддреА рд╣реИрдВ, рдФрд░ F#
рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рд╣рд╛рдпрдХ рд╡рд┐рдзрд┐, рдХреЛ рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
let eq_gen (x : 'a) (y : 'a) = x = y let eq xy = x = y eq_gen 5.0 6.0 |> ignore eq_gen 5 6 |> ignore eq 5.0 6.0 |> ignore eq 5 6 |> ignore
Java
рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
рдореЗрд░реЗ рд▓рд┐рдП Java
рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдХрдард┐рди рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд╣рд╛рдБ рддрдХ рдореИрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдБ, рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рдХрд╛рд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рд╣реИрдВред Java
рдореЗрдВ рдкреНрд░рд┐рдорд┐рдЯрд┐рд╡ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд░реИрдкрд░ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рд┐рдорд┐рдЯрд┐рд╡ рдмрд╛рдп-рд╡реИрд▓реНрдпреВ Long
рд▓рд┐рдП рдПрдХ рд╕рдВрджрд░реНрдн Long
), рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдмреЗрд╕ рдХреНрд▓рд╛рд╕ Number
ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк Number
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рднрд╛рд╡ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред
рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рд╣реВрдВ рддреЛ рдореБрдЭреЗ рд╕реБрдзрд╛рд░реЛред
C++
?
C++
рдЪреЗрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рднрд╛рд╖рд╛ рд╣реИред
C++
рдЙрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдЧ рдкреНрд░рд╢рд╕реНрдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХреБрдЫ рдорд╛рдирддреЗ рд╣реИрдВ ... рдЕрдкреНрд░рд╛рдХреГрддрд┐рдХ ред
рд╕рд╛рдорд╛рдиреНрдп рдЬреНрдЮрд╛рди (рдЬреЗрдирд░рд┐рдХ) рдХреЗ рд╡рд┐рдкрд░реАрдд рдЯреЗрдореНрдкреНрд▓реЗрдЯ (рдЙрд░реНрдл рдЯреЗрдореНрдкреНрд▓реЗрдЯ), рд╢рд╛рдмреНрджрд┐рдХ рдЕрд░реНрдереЛрдВ рдореЗрдВ, рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╣реИрдВ ред рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╕рдордп, рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдпрд╣ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЙрдкрд▓рдмреНрдз рд╣реИред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, C++
, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рдХреЛрдб рдорд╛рдиреНрдп рд╣реИ:
#include <iostream> template<typename T, std::enable_if_t<std::is_arithmetic<T>::value>* = nullptr> T Add (T left, T right) { return left + right; } int main() { std::cout << Add(5, 6) << std::endl; std::cout << Add(5.0, 6.0) << std::endl; // std::cout << Add("a", "b") << std::endl; Does not compile }
is_arithmetic
, рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, char
рдФрд░ bool
рджреЛрдиреЛрдВ рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░, C#
рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ char
рдмрд░рд╛рдмрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрдХрд╛рд░ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо / рдХрдВрдкрд╛рдЗрд▓рд░ / рдореВрди рдЪрд░рдг рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред
рдЧрддрд┐рд╢реАрд▓ рдЯрд╛рдЗрдкрд┐рдВрдЧ рднрд╛рд╖рд╛рдПрдБ
рдЕрдВрдд рдореЗрдВ, рдЧрдгрдирд╛ рджреНрд╡рд╛рд░рд╛ рдзрд╛рд░рд┐рдд, рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЧрдИ (рдФрд░ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЧрдИ ) рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдРрд╕реА рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рдЖрдорддреМрд░ рдкрд░ рдЧрдгрдирд╛ рдХреЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рд╕реЗ рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ: рдпрджрд┐ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ, рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рддреЛ рдСрдкрд░реЗрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
Python
(3.7.3 x64):
def add (x, y): return x + y type(add(5, 6))
R
(3.6.1 x64)
add <- function(x, y) x + y # Or typeof() vctrs::vec_ptype_show(add(5, 6)) # Prototype: double vctrs::vec_ptype_show(add(5L, 6L)) # Prototype: integer vctrs::vec_ptype_show(add("5", "6")) # Error in x + y : non-numeric argument to binary operator
рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, C # рджреБрдирд┐рдпрд╛ рдореЗрдВ: рд╣рдо рдЧрдгрд┐рддреАрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдкреНрд░рдХрд╛рд░ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред C#
рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдп рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рд╕рдВрд░рдЪрдирд╛рдПрдБ, рдЬреЛ рдХрд┐ System.Object
(рдФрд░ System.ValueType
) рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╣реИрдВ, рдЙрдирдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдирд╣реАрдВ рд╣реИред рдПрдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдФрд░ рддрд╛рд░реНрдХрд┐рдХ рд╕реАрдорд╛ рд╣реИ where T : struct
ред C# 7.3
рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ C# 7.3
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ where T : unmanaged
рдмрд╛рдзрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ T
рдПрдХ , null
ред рдЖрджрд┐рдо рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, char
, bool
, decimal
, рдХреЛрдИ рднреА Enum
рдФрд░ рдХреЛрдИ рднреА рд╕рдВрд░рдЪрдирд╛ рдЬрд┐рдирдХреЗ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдПрдХ рд╣реА unmanaged
рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рдЗрди рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВред рдпрд╛рдиреА рдпрд╣ рдкреНрд░рдХрд╛рд░ рдкрд░реАрдХреНрд╖рд╛ рдкрд╛рд╕ рдХрд░реЗрдЧрд╛:
public struct Coords<T> where T : unmanaged { public TX; public TY; }
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХреЗрд╡рд▓ рд╡рд╛рдВрдЫрд┐рдд рдЕрдВрдХрдЧрдгрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рд▓реЗрдЦ рдХреЗ рд╢реАрд░реНрд╖рдХ рдореЗрдВ Unsafe
- рд╣рдореЗрдВ рдЕрдкрдиреЗ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ T Add<T>(T left, T right) where T : unmanaged
рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд░реЗрдЧрд╛ рдпрджрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрд╕рдВрдЧрдд рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред
рдкрд╣рд▓рд╛ рдкреНрд░рдпреЛрдЧ, рднреЛрд▓рд╛: dynamic
dynamic
рдкрд╣рд▓рд╛ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдЙрдкрдХрд░рдг рд╣реИ рдЬреЛ рд╣рдорд╛рд░реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╣рдорд╛рд░реА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП dynamic
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд┐рд▓реНрдХреБрд▓ рдмреЗрдХрд╛рд░ рд╣реИ - dynamic
object
рдмрд░рд╛рдмрд░ рд╣реИ, рдФрд░ dynamic
рдЪрд░ рд╡рд╛рд▓реЗ рддрд░реАрдХреЛрдВ рдХреЛ рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд░рд╛рдХреНрд╖рд╕реА рдкреНрд░рддрд┐рдмрд┐рдВрдм рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдмреЛрдирд╕ рдХреЗ рд░реВрдк рдореЗрдВ - рд╣рдорд╛рд░реЗ рдмрд╛рдп-рд╡реИрд▓реНрдпреВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдкреИрдХрд┐рдВрдЧ / рдЕрдирдкреИрдХрд┐рдВрдЧред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ :
public class Class { public static void Method() { var x = Add(5, 6); var y = Add(5.0, 6.0); } private static dynamic Add(dynamic left, dynamic right) => left + right; }
рдмрд╕ Method
рд╡рд┐рдзрд┐ рдХреЗ IL
:
.method public hidebysig static void Method () cil managed {
рднрд░реА рд╣реБрдИ 5
, рднрд░реА рд╣реБрдИ, рднрд░реА рд╣реБрдИ 6
, рднрд░реА рд╣реБрдИ, рдЬрд┐рд╕реЗ object Add(object, object)
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╡рд┐рдХрд▓реНрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╣рдореЗрдВ рд╢реЛрднрд╛ рдирд╣реАрдВ рджреЗрддрд╛ред
рджреВрд╕рд░рд╛ рдкреНрд░рдпреЛрдЧ, "рдорд╛рдереЗ рдореЗрдВ"
рд╡реИрд╕реЗ, dynamic
рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░рд┐рдорд┐рдд рд╣реИ, рдФрд░ рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдиреЗ рдЬрд╛рддреЗ рд╣реИрдВред рдЪрд▓реЛ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдПрдХ рд╢рд╛рдЦрд╛ рдореБрдХреБрдЯ рдХреЗ рд╕рд╛рде рдмрд╛рдВрдзрд╛ рдФрд░ рдЗрд╕реЗ рд▓рд┐рдЦреЗрдВ: рдпрджрд┐ рд╣рдорд╛рд░рд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ , рддреЛ рдХреБрдЫ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ, рдЕрдиреНрдпрдерд╛ - рдпрд╣рд╛рдВ рдЕрдкрд╡рд╛рдж рд╣реИред
public static T Add<T>(T left, T right) where T : unmanaged { if(left is int i32Left && right is int i32Right) {
III, рдпрд╣рд╛рдБ рд╣рдо рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрднреА рднреА рдЙрди рдкрд░ рднреА рдСрдкрд░реЗрд╢рди рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдкрд░рд┐рдгрд╛рдореА рд╕рд╢рд░реНрдд int
рдХреЛ рдПрдХ рдЕрдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░ T
рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИред return (T)(i32Left + i32Right)
рд╕рдВрдХрд▓рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ рдХрд┐ T
int
(рднрд▓реЗ рд╣реА рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╣реИ)ред рдЖрдк рдбрдмрд▓ рд░реВрдкрд╛рдВрддрд░рдг return (T)(object)(i32Left + i32Right)
ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд░рд╛рд╢рд┐ рдкреИрдХ рдХреА рдЬрд╛рддреА рд╣реИ, рдлрд┐рд░ рдЗрд╕реЗ T
рдореЗрдВ рдЕрдирдкреИрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ T
рдпрд╣ рддрднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬрдм рдкреНрд░рдХрд╛рд░ рдкреИрдХреЗрдЬрд┐рдВрдЧ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдкреИрдХреЗрдЬрд┐рдВрдЧ рдХреЗ рдмрд╛рдж рдореЗрд▓ рдЦрд╛рддреЗ рд╣реЛрдВ ред рдЖрдк int
рдкреИрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ double
рдореЗрдВ рдЕрдирдкреИрдХ рдХрд░реЗрдВ, рднрд▓реЗ рд╣реА рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг int -> double
ред рдЗрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд┐рд╢рд╛рд▓ рд╢рд╛рдЦрд╛рдПрдВ рдФрд░ рдЕрдирдкреИрдХрд┐рдВрдЧ рдкреИрдХреЗрдЬреЛрдВ рдХреА рдмрд╣реБрддрд╛рдпрдд, рднрд▓реЗ if
рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╣реЛред рдпрд╣ рд╡рд┐рдХрд▓реНрдк рднреА рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред
рдЦреИрд░, рдЦреЗрд▓рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣реА рдХрд╛рдлреА рд╣реИред рд╣рд░ рдХреЛрдИ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ C#
рдореЗрдВ рдСрдкрд░реЗрдЯрд░ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡рд╣рд╛рдВ, +
, -
, ==
!=
рдФрд░ рдЗрддрдиреЗ рдкрд░ рд╣реИрдВред рд╣рдореЗрдВ рдмрд╕ рдЗрддрдирд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдЕрдиреБрд░реВрдк рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА T
рд╕реНрдЯреЗрдЯрд┐рдХ рд╡рд┐рдзрд┐ рдирд┐рдХрд╛рд▓рдиреА рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд░рд┐рд╡рд░реНрдзрди - рдмрд╕ рдЗрддрдирд╛ рд╣реАред рдареАрдХ рд╣реИ, рд╣рд╛рдБ, рдлрд┐рд░ рд╕реЗ рдПрдХ рджреЛ рдкреИрдХреЗрдЬ, рд▓реЗрдХрд┐рди рдХреЛрдИ рд╢рд╛рдЦрд╛ рдФрд░ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВред рдкреВрд░реА рдЪреАрдЬ рдХреЛ рдЯрд╛рдЗрдк T
рджреНрд╡рд╛рд░рд╛ рдХреИрд╢ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЖрдо рддреМрд░ рдкрд░ рд╣рд░ рддрд░рд╣ рд╕реЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЧрддрд┐ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдПрдХрд▓ рдкреНрд░рддрд┐рдмрд┐рдВрдм рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрдгрд┐рддреАрдп рдСрдкрд░реЗрд╢рди рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред рдЦреИрд░, рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ:
public static T Add<T>(T left, T right) where T : unmanaged {
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдкреНрд░рдХрд╛рд░ (рд▓реЗрдХрд┐рди decimal
рдирд╣реАрдВ) рдореЗрдВ рдРрд╕реА рдХреЛрдИ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИред рд╕рднреА рдСрдкрд░реЗрд╢рди IL
рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ add
ред рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рддрд┐рдмрд┐рдВрдм рд╣рдорд╛рд░реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
System.Linq.Expressions
Expressions
рдЖрдзрд╛рд░рд┐рдд рд╕рдорд╛рдзрд╛рди рдЬреЙрди рд╕реНрдХреАрдЯ рдХреЗ рдмреНрд▓реЙрдЧ рдкрд░ рдпрд╣рд╛рдВ (рдорд╛рд░реНрдХ рдЧреНрд░реЗрд╡реЗрд▓ рджреНрд╡рд╛рд░рд╛) рд╡рд░реНрдгрд┐рдд рд╣реИред
рд╡рд┐рдЪрд╛рд░ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЯрд╛рдЗрдк T
рдЬреЛ рдСрдкрд░реЗрд╢рди +
рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдмрдирд╛рдПрдВ:
(x, y) => x + y;
рдЙрд╕рдХреЗ рдмрд╛рдж, рдХреИрд╢ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдРрд╕реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рд╣рдореЗрдВ рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рдПрдХ рдСрдкрд░реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рддреЛ рдЪрд▓рд┐рдП рд▓рд┐рдЦрддреЗ рд╣реИрдВред
private static readonly Dictionary<(Type Type, string Op), Delegate> Cache = new Dictionary<(Type Type, string Op), Delegate>(); public static T Add<T>(T left, T right) where T : unmanaged { var t = typeof(T);
рд╣рдм рдкрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреЗрдбрд╝реЛрдВ рдФрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рдХрд╛рд╢рд┐рдд рдХреА рдЧрдИ рдереА
рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ, рднрд╛рд╡ рд╣рдореЗрдВ рдЕрдкрдиреА рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ - рдХрд┐рд╕реА рднреА рд╕рд╛рдорд╛рдиреНрдп рдСрдкрд░реЗрд╢рди рдХреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╡рд┐рдзрд┐ рдХрд╣рдХрд░ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдСрдкрд░реЗрд╢рди рдХреЛ рдЙрд╕реА рддрд░рд╣ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд▓рдЧрднрдЧ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рд╣рдо рд╕рд╛рд░реЗ рдирд┐рдпрдо рддреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ
рдХреНрдпрд╛ CLR/C#
рдХреА рд╢рдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреБрдЫ рдФрд░ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ? рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХрд┐рд╕ рд╡рд┐рдзрд┐ рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ:
public class Class { public static double Add(double x, double y) => x + y; public static int Add(int x, int y) => x + y;
рд╕рдВрдмрдВрдзрд┐рдд IL
рдХреЛрдб рдореЗрдВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рд╣реА рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ:
ldarg.0 ldarg.1 add ret
рдпрд╣ рдмрд╣реБрдд рд╣реА add
рдСрдк рдХреЛрдб рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрдВрдХрдЧрдгрд┐рдд рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд╛рди рдкрд░ decimal
рдХреЛ static decimal decimal.op_Addition(decimal, decimal)
рдХрд╣рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдо рдПрдХ рдРрд╕реА рд╡рд┐рдзрд┐ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ IL
рдХреЛрдб рд╣реЛрдЧрд╛? рдЦреИрд░, рдЬреЙрди рд╕реНрдХреАрдЯ рдиреЗ рдЪреЗрддрд╛рд╡рдиреА рджреА рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИ ред рдЕрдкрдиреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд╣ рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ ( decimal
рд╕рд╣рд┐рдд), рд╕рд╛рде рд╣реА рд╕рд╛рде рдЙрдирдХреЗ nullable
рдПрдирд╛рд▓реЙрдЧреНрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдХрд╛рдлреА nontrivial IL
рд╕рдВрдЪрд╛рд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдФрд░ рдЬрд░реВрд░реА рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдиреЗрддреГрддреНрд╡ рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рд╣рдо рдЕрднреА рднреА рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдореЗрд░реЗ рдЖрд╢реНрдЪрд░реНрдп рдХреЗ рд▓рд┐рдП, Visual Studio
IL
рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдФрд░ IL
рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдирд╣реАрдВ рд╣реИрдВред рдЖрдк рдХреЗрд╡рд▓ IL
рдореЗрдВ рдХреЛрдб рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдирд╣реАрдВ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИред ILSupport
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ IL
рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ рдЬреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ IL
рдХреЛрдб рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП *.csproj
рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдмреЗрд╢рдХ, IL
рдореЗрдВ рд╕рдм рдХреБрдЫ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдХрд╛рдлреА рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓реЗрдЦрдХ ForwardRef
рдлреНрд▓реИрдЧ рдХреЗ рд╕рд╛рде рдмрд┐рд▓реНрдЯ-рдЗрди MethodImpl
рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЖрдкрдХреЛ рд╡рд┐рдзрд┐ рдХреЛ extern
рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ рдФрд░ рд╡рд┐рдзрд┐ рдХреЗ рд╢рд░реАрд░ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
[MethodImpl(MethodImplOptions.ForwardRef)] public static extern T Add<T>(T left, T right) where T : unmanaged;
рдЕрдЧрд▓рд╛ рдЪрд░рдг *.il
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ IL
рдХреЛрдб рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрдирд╛ рд╣реИ:
.method public static hidebysig !!T Add<valuetype .ctor (class [mscorlib]System.ValueType modreq ([mscorlib]System.Runtime.InteropServices.UnmanagedType)) T>(!!T left, !!T right) cil managed { .param type [1] .custom instance void System.Runtime.CompilerServices.IsUnmanagedAttribute::.ctor() = (01 00 00 00 ) ldarg.0 ldarg.1 add ret }
рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реАрдВ рднреА !!T
, рд╣рдо CLR
рдХреЛ рджреЛ рддрд░реНрдХ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВред рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╕рдм рдХреБрдЫ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд╡рд┐рд╡реЗрдХ рдкрд░ рд╣реИред рд╣реИрд░рд╛рдиреА рдХреА рдмрд╛рдд рд╣реИ, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдЬрд▓реНрджреАред
рдереЛрдбрд╝рд╛ рд╕рд╛ рдмреЗрдВрдЪрдорд╛рд░реНрдХ
рд╕рдВрднрд╡рддрдГ, рдПрдХ рдИрдорд╛рдирджрд╛рд░ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреБрдЫ рдЬрдЯрд┐рд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХреА рдЧрдгрдирд╛ "рд╣реЗрдб-рдСрди" рдЗрди рдЦрддрд░рдирд╛рдХ IL
рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреА рдЬрд╛рдПрдЧреАред рдореИрдВрдиреЗ рдПрдХ рд╕рд░рд▓ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд▓рд┐рдЦрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╡рд░реНрдЧреЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ double
рд╕рд░рдгреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЕрдВрддрд┐рдо рд░рд╛рд╢рд┐ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИред рдСрдкрд░реЗрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ C#
рдСрдкрд░реЗрдЯрд░реЛрдВ +
, *
рдФрд░ /
, рдЬреИрд╕рд╛ рдХрд┐ рд╕реНрд╡рд╕реНрде рд▓реЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, Expressions
рдФрд░ IL
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдорд┐рдд рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред
рдкрд░рд┐рдгрд╛рдо рд▓рдЧрднрдЧ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИрдВ:DirectSum
рдорд╛рдирдХ рдСрдкрд░реЗрдЯрд░реЛрдВ +
, *
рдФрд░ /
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдпреЛрдЧ рд╣реИ;BranchSum
рдХрд╛ рдЙрдкрдпреЛрдЧ object
рдорд╛рдзреНрдпрдо рд╕реЗ рдЯрд╛рдЗрдк рдФрд░ рдХрд╛рд╕реНрдЯ рджреНрд╡рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ;UnsafeBranchSum
Unsafe.As<,>()
рдорд╛рдзреНрдпрдо рд╕реЗ рдЯрд╛рдЗрдк рдФрд░ Unsafe.As<,>()
рджреНрд╡рд╛рд░рд╛ UnsafeBranchSum
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ;ExpressionSum
рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдХреИрд╢реНрдб ExpressionSum
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ ( Expression
);UnsafeSum
рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд IL
рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
рдкреЗрд▓реЛрдб рдмреЗрдВрдЪрдорд╛рд░реНрдХ - рдкреНрд░рдХрд╛рд░ double
рдФрд░ рдЖрдХрд╛рд░ N
рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдкреВрд░реНрд╡-рднрд░реЗ рд╕рд░рдгреА рдХреЗ рддрддреНрд╡реЛрдВ рдХреЗ рд╡рд░реНрдЧреЛрдВ рдХреЛ рд╕рдореЗрдЯрдирд╛, рдЗрд╕рдХреЗ рдмрд╛рдж N
рджреНрд╡рд╛рд░рд╛ рдпреЛрдЧ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдФрд░ рдЗрд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛; рдЕрдиреБрдХреВрд▓рди рд╢рд╛рдорд┐рд▓ рдереЗред
BenchmarkDotNet=v0.12.0, OS=Windows 10.0.18362 Intel Core i7-2700K CPU 3.50GHz (Sandy Bridge), 1 CPU, 8 logical and 4 physical cores .NET Core SDK=3.1.100 [Host] : .NET Core 3.1.0 (CoreCLR 4.700.19.56402, CoreFX 4.700.19.56404), X64 RyuJIT Job-POXTAH : .NET Core 3.1.0 (CoreCLR 4.700.19.56402, CoreFX 4.700.19.56404), X64 RyuJIT Runtime=.NET Core 3.1
рд╣рдорд╛рд░рд╛ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдб рд▓рдЧрднрдЧ 2.5
рдЧреБрдирд╛ рдзреАрдорд╛ рд╣реИ (рдПрдХ рдСрдкрд░реЗрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ)ред рдЗрд╕реЗ рдЗрд╕ рддрдереНрдп рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдард╣рд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ "рдорд╛рдереЗ" рдХреА рдЧрдгрдирд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрдВрдкрд╛рдЗрд▓рд░ add
рдСрдк рдХреЛрдб рдореЗрдВ a + b
рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ a + b
, рдФрд░ рдПрдХ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рд╕реНрдерд┐рд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдзреАрдорд╛ рд╣реИред
рд╕рдорд╛рдкрди рдХреЗ рдмрдЬрд╛рдп: рдЬрдм true != true
рдХреБрдЫ рджрд┐рдиреЛрдВ рдкрд╣рд▓реЗ, рдореИрдВ рдЬреЗрд░реЗрдб рдкрд╛рд░реНрд╕рдиреНрд╕ рдХреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЯреНрд╡реАрдЯ рдкрд░ рдЖрдпрд╛ рдерд╛:
рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд "рдЧрд▓рдд" рдЫрд╛рдкреЗрдВрдЧреЗ
рдмреВрд▓ рдм = ...
if (b) рдХрдВрд╕реЛрд▓.рдЯреНрд░рд╛рдЗрдЯрд▓рд╛рдЗрди (b.IsTrue ());
рдпрд╣ рдЗрд╕ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХрд╛ рдЙрддреНрддрд░ рдерд╛, рдЬреЛ true
рдХреЗ рд▓рд┐рдП bool
рд╕рддреНрдпрд╛рдкрди рдХреЛрдб рджрд┐рдЦрд╛рддрд╛ true
, рдЬреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
public static bool IsTrue(this bool b) { if (b == true) return true; else if (b == false) return false; else return !true && !false; }
рдЪреЗрдХ рдмреЗрдорд╛рдиреА рд▓рдЧрддреЗ рд╣реИрдВ, рд╣реИ рдирд╛? рдЬрд╛рд░реЗрдб рдПрдХ рдкреНрд░рддрд┐рд░реВрдк рджреЗрддрд╛ рд╣реИ рдЬреЛ bool
рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ ред рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ bool
byte
( sizeof(bool) == 1
) рд╣реИ, рдЬрдмрдХрд┐ false
0
рдФрд░ true
1
рдореИрдЪред рдЬрдм рддрдХ рдЖрдк рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рд╕реНрд╡рд┐рдВрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, bool
рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдФрд░ рдЕрдиреБрдорд╛рдирд┐рдд рд░реВрдк рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдЬреЗрд░реЗрдб рдиреЗ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ, рдЖрдк рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ 2
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ bool
рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЪреЗрдХреЛрдВ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛:
bool b = false; byte* ptr = (byte*)&b; *ptr = 2;
рд╣рдо рдЕрдкрдиреЗ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдЧрдгрд┐рддреАрдп рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рдорд╛рди рдкреНрд░рднрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╣ Expressions
рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ):
var fakeTrue = Subtract<bool>(false, true); var val = *(byte*)&fakeTrue; if(fakeTrue) Assert.AreNotEqual(fakeTrue, true); else Assert.Fail("Clause not entered.");
рд╣рд╛рдВ, рд╣рд╛рдВ, рд╣рдо true
рд╢рд╛рдЦрд╛ рдХреЗ рдЕрдВрджрд░ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╕реНрдерд┐рддрд┐ true
, рдФрд░ рд╣рдо рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ true
рдирд╣реАрдВ true
ред рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реИ? рдпрджрд┐ рдЖрдк рдЪреЗрдХ рдХреЗ рдмрд┐рдирд╛ 0
( =false
) 1
( =true
) рд╕реЗ рдШрдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ byte
рдпрд╣ 255
рдмрд░рд╛рдмрд░ рд╣реЛрдЧрд╛ред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, 255
(рд╣рдорд╛рд░реЗ fakeTrue
) 1
(рд╡рд╛рд╕реНрддрд╡рд┐рдХ true
) рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП fakeTrue
рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмреНрд░рд╛рдВрдЪрд┐рдВрдЧ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред
if
рдЙрд▓рдЯрд╛ рд╣реЛрддрд╛ рд╣реИ: рдПрдХ рд╕рд╢рд░реНрдд рд╢рд╛рдЦрд╛ рдбрд╛рд▓реА рдЬрд╛рддреА рд╣реИ; рдпрджрд┐ рд╕реНрдерд┐рддрд┐ рдЭреВрдареА рд╣реИ , рддреЛ рдмрд┐рдВрджреБ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреНрд░рдордг if
рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрдд рдХреЗ рдмрд╛рдж рд╣реЛрддрд╛ рд╣реИред рд╕рддреНрдпрд╛рдкрди brfalse
/ brfalse_S
рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕реНрдЯреИрдХ рдкрд░ рдЕрдВрддрд┐рдо рдорд╛рди рдХреА рддреБрд▓рдирд╛ рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рдХрд░рддрд╛ рд╣реИ ред рдпрджрд┐ рдорд╛рди рд╢реВрдиреНрдп рд╣реИ, рддреЛ рдпрд╣ false
, рд╣рдо if
рдмреНрд▓реЙрдХ рдкрд░ рдХрджрдо рд░рдЦрддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, fakeTrue
рд╕рд┐рд░реНрдл рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЪреЗрдХ рдкрд╛рд╕ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди fakeBool
рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ рдЬрд╛рд░реА рд░рд╣рддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ рд╣рдо fakeBool
рдореВрд▓реНрдп рдХреА рддреБрд▓рдирд╛ рд╕рдЪреНрдЪреЗ рдореВрд▓реНрдп рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдирдХрд╛рд░рд╛рддреНрдордХ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред
UPD01:
Shai_hulud рдФрд░ blowin рдХреЗ рд╕рд╛рде рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдореЗрдВ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рдЬреЛрдбрд╝рд╛ рд╣реИ рдЬреЛ рдПрдХ рд╢рд╛рдЦрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ if(typeof(T) == typeof(int)) return (T)(object)((int)(object)left + (int)(object)right);
ред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ JIT
рдХреЛ рдЪреЗрдХ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХрдо рд╕реЗ рдХрдо рдЬрдм T
рдПрдХ struct
, рддреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рддрд░реАрдХреЗ рдЕрднреА рднреА рдкрд░рд┐рдорд╛рдг рдзреАрдореА рдХреЗ рдПрдХ рдЖрджреЗрд╢ рдХрд╛ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд░реВрдкрд╛рдВрддрд░рдг T
-> int
-> T
рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реИрдВ, рдпрд╛ рдмреЙрдХреНрд╕рд┐рдВрдЧ / рдЕрдирдмреЙрдХреНрд╕рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рдкрд░рд┐рдгрд╛рдо MethodImpl
рдЭрдВрдбреЗ рд╕реЗ рдХрд╛рдлреА рдкреНрд░рднрд╛рд╡рд┐рдд MethodImpl
рд╣реЛрддреЗ рд╣реИрдВред
UPD02:
рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ xXxVano рдиреЗ рдЯрд╛рдЗрдк рдХрд░рдХреЗ рдбрд╛рд▓реА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА T
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдпрд╛ <<> Unsafe.As<TFrom, TTo>()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ред object
рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдмреНрд░рд╛рдВрдЪрд┐рдВрдЧ рдФрд░ рдХрд╕реНрдЯрдо рдХреЗ рдЕрдиреБрд░реВрдк, рдореИрдВрдиреЗ рд╕рднреА рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдмреНрд░рд╛рдВрдЪрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рддреАрди рдСрдкрд░реЗрд╢рди (рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЧреБрдгрд╛ рдФрд░ рднрд╛рдЧ) рд▓рд┐рдЦрд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдореИрдВрдиреЗ рдПрдХ рдФрд░ рдмреЗрдВрдЪрдорд╛рд░реНрдХ ( UnsafeBranchSum
) рдЬреЛрдбрд╝рд╛ред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рд╕рднреА рд╡рд┐рдзрд┐рдпрд╛рдБ (рднрд╛рд╡реЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░) рд▓рдЧрднрдЧ рд╕рдорд╛рди рдПрд╕ рдПрдо рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИрдВ (рдЬрд╣рд╛рдБ рддрдХ рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рдореЗрд░реЗ рд╕реАрдорд┐рдд рдЬреНрдЮрд╛рди рд╕реЗ рдореБрдЭреЗ рдиреНрдпрд╛рдп рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИ), рдХрд┐рд╕реА рдЕрдЬреНрдЮрд╛рдд рдХрд╛рд░рдг рд╕реЗ, рдмреНрд░рд╛рдВрдЪрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рджреЛрдиреЛрдВ рд╡рд┐рдзрд┐рдпрд╛рдБ рджреЛрдиреЛрдВ рд╕реАрдзреЗ DirectSum
( DirectSum
) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдзреАрдореА рд╣реИрдВ рдЬреЗрдирд░рд┐рдХ рдФрд░ IL
рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдЗрд╕ рдкреНрд░рднрд╛рд╡ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдирд╣реАрдВ рд╣реИ, рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╕рдордп рд╡реНрдпрддреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдиреБрдкрд╛рддрд┐рдХ рд░реВрдк рд╕реЗ N
рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ JIT
рд╕рднреА рдЬрд╛рджреВ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд░рдВрддрд░ рдУрд╡рд░рд╣реЗрдб рд╣реИред рдпрд╣ рдУрд╡рд░рд╣реЗрдб рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ IL
рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдЧрд╛рдпрдм рд╣реИред , IL
- , / / , 100% ( , ).
, , - .