یک نکتهی تکمیلی: ساده شدن تعریف Lambda Expressions در C# 10.0
تا پیش از C# 10.0 جهت تعریف Lambda Expressions نیاز بود تا کمی بیشتر کد نوشت. برای مثال:
Func<string, int> parse = (string s) => int.Parse(s);
در یک چنین تعاریفی، ذکر صریح Func و Action ضروری است.
با ارائهی C# 10.0، مفهومی به نام natural lambda expression ارائه شدهاست که در آن کامپایلر سعی میکند تا نوع این Action و Funcها را بر اساس تعریف lambda expression، تشخیص دهد. در این حالت قطعه کد فوق، به صورت زیر خلاصه میشود:
var parse = (string s) => int.Parse(s);
البته باید دقت داشت که این type inferring، بر اساس ذکر دقیق نوعهای سمت راست عبارت فوق میسر شده؛ وگرنه قطعه کد زیر، با خطای «The delegate type could not be inferred» کامپایل نمیشود؛ چون نوع پارامتر lambda مشخص نشدهاست:
var upper = (s) => s.ToUpperInvariant();
همچنین در C# 10.0 میتوان این نوع پیشفرض تشخیص داده شدهی توسط کامپایلر را نیز صراحتا مشخص کرد و تغییر داد:
var createException = (bool b) => b ? new ArgumentNullException() : new DivideByZeroException();
قطعه کد فوق نیز با خطای «The delegate type could not be inferred» کامپایل نمیشود؛ چون دقیقا مشخص نیست که چه نوع خروجی را باید مدنظر قرار داد. در این حالت میتوان این نوع را به صورت زیر، پیش از تعریف Lambda Expression قرار داد و مشخص کرد:
var createException = Exception (bool b) => b ? new ArgumentNullException() : new DivideByZeroException();
در این حالت نوع خروجی، از نوع Exception درنظر گرفته شدهاست. مثالی دیگر در این زمینه:
var oneTwoThreeArray = () => new[]{1, 2, 3}; // inferred type is Func<int[]>
var oneTwoThreeList = IList<int> () => new[]{1, 2, 3}; // same body, but inferred type is now Func<IList<int>>
این natural return types، به method groups نیز بسط یافتهاست. منظور از method groups، متدهایی بدون ذکر لیست آرگومانهای آنها است:
Func<int> read = Console.Read;
Action<string> write = Console.Write;
اینها نیز در C# 10.0 به صورت خلاصهی زیر قابل بیان هستند:
var read = Console.Read; // Just one overload; Func<int> inferred
var write = Console.Write; // ERROR: Multiple overloads, can't choose
البته در اینجا اگر متدی چندین overload داشته باشد، دیگر نمیتوان از روش خلاصه شدهی فوق استفاده کرد.
و در آخر امکان تعریف ویژگیها (attributes) نیز بر روی lambda expressions در C# 10.0 میسر شدهاست:
var choose = [Example(2)][Example(3)] object (bool b) => b ? 1 : "two";
پ.ن.
تمام اینها در جهت پشتیبانی و ساده کردن کار با Minimal APIs ارائه شدهی در ASP.NET Core 6x به زبان #C اضافه شدهاند.