C# 10 — Lambda expression e method group

La versione 6 del framework .NET è ora disponibile e con essa la decima versione del linguaggio C#. Insieme al nostro .Net Solution Developer e Sharepoint Solution Architect Massimiliano Macchia vedremo una panoramica delle novità introdotte attraverso una serie di articoli.

In questo secondo articolo affronteremo le novità introdotte per lambda expression e method groupQui l’articolo precedente.

 

Premessa

Utilizzando Visual Studio 2022 e creando un nuovo progetto basato su .NET Core automaticamente viene suggerito il framework .NET 6, mantenendo tale selezione saranno utilizzabili le funzionalità e le caratteristiche di C# 10.
Al momento non è presente supporto a .NET 6 per versioni precedenti di Visual Studio per Windows.

Per verificare la versione correntemente installata di .NET (core) è possibile aprire un prompt dei comandi ed eseguire il comando “dotnet –version”; se non si verificano errori durante l’installazione di Visual Studio 2022 la nuova versione del framework sarà installata automaticamente.

 

Lambda expression

Già da qualche versione, in C#, possiamo usare le lambda expression per creare funzioni anonime.

Una lambda expression può essere definita i uno dei seguenti due modi:

Se è presente un solo parametro in input le parentesi tonde possono anche essere omesse.

 

Ogni lambda expression può essere convertita in un tipo delegato. Se la lambda non restituisce un valore, può essere convertita nel tipo delegato Action; altrimenti può essere convertita solo in un tipo delegato Func. Solo la Func, infatti, consente di specificare anche il tipo della variabile di ritorno.

 

Fino a C# 9, quando operavamo questo tipo di conversione eravamo obbligati a tipizzare in modo esplicito il delegato. Ad esempio nel modo illustrato nell’immagine seguente.

Se provavamo ad assegnare una lambda ad una variabile object, ottenevamo un errore.

Se provavamo ad assegnare una lambda ad una variabile var, ottenevamo un errore.

 

Natural types…

A partire da C#10 le lambda non necessitano più di questo “target type” esplicito. Adesso sarà il compilatore a provare a determinare il tipo richiesto. Si dice che il compilatore determina il “natural type” della nostra espressione.

 

… nelle lambda expression

Questo significa prima di tutto che ora possiamo definire le nostre lambda utilizzando semplicemente var.

C’è un ulteriore vantaggio. Il “natural type” delle lambda consente di poter assegnare le lambda a variabili con tipi “deboli”. Consentendo così ulteriore libertà, flessibilità e dinamicità al nostro codice.

 

… nei method group

Detto in modo estremamente semplificato, i method group sono nomi di metodi privi della lista di argomenti.


Detto in modo un poco più formale, un method group è una espressione che rappresenta una collezione di “overloaded methods”, ovvero metodi con lo stesso nome che si differenziano per gli argomenti che accettano.

Anche per i method group, a partire da C# 10, il compilatore può determinare il natural type corrispondente…

oppure così

… ma non per tutti i method group. Soltanto i method group che dispongono di un singolo overload possono essere automaticamente determinati dal compilatore.

 

Tipi di ritorno

In uno degli esempi precedenti abbiamo scritto un’assegnazione condizionale come questa:

Abbiamo dovuto scrivere l’assegnazione in questo modo perché il compilatore non ci permette di utilizzare in questo caso l’operatore ternario, che probabilmente ci sembrerebbe una soluzione più elegante.

Come possiamo vedere dall’errore evidenziato, infatti, il compilatore non riesce a gestire le conversioni richieste.

Anche se utilizzassimo una lambda non avremmo successo perché, come mostrato nella seguente figura, il compilatore non riesce a dedurre il tipo di delegato richiesto.

Un’altra novità di C# 10 ci arriva in soccorso per semplificare la nostra assegnazione condizionale: la possibilità di definire un tipo di ritorno per la lamdba.

Grazie a questa nuova funzionalità, non presente nelle versioni precedenti di C#, riusciamo ad eliminare l’ambiguità che impediva al compilatore di procedere.

 

NOTA: il problema appena illustrato si riusciva ad aggirare già nelle versioni precedenti effettuando un cast esplicito al tipo di destinazione, ma ho trovato sempre la soluzione del cast esplicito scomoda, inelegante e brutta da vedere 🙂

Conclusioni

Abbiamo visto alcune novità legate all’uso di lambda expression e method group che rendono meno rigida e “cerimoniale” la definizione e la gestione di questi tipi di elementi.

In Microsoft sembrano convinti che queste novità risulteranno particolarmente utili e apprezzate nel contesto delle Minimal API.
Vedremo le Minimal API in un prossimo articolo.

Riferimenti

Welcome to C# 10, .NET Blog
What’s new in C# 10, Microsoft Documentation
Lambda expressions, Microsoft Documentation
Expressions, Microsoft Documentation

Condividi l'articolo

Condividi su facebook
Condividi su twitter
Condividi su linkedin
Condividi su email
Categorie

Big Data & Data Analytics
ML & AI
Cloud Services
Web Mobile
Digital Workspace
Software Development
UX Design
Gamification
News
Eventi

Industries

Retail
Public Sector
Automotive
Mobile & Betting
Travel
Energy
Telco & Media
HealthCare
Financial Services
Homeland Security

Newsletter
Seguici su