لماذا استخدام Expression<Func<T>> بدلاً من Func<T> في C#؟ اشرح مع أمثلة
مرحباً بالجميع! بدأت تعلم C# وصادفت هذا البناء: `Expression>`. من الواضح أن `Func` هو مجرد مفوض (delegate) يمكن استدعاؤه. لكن لماذا نلفه في `Expression<>`؟ يبدو أنه يمكن ببساطة تمرير lambda كـ `Func` واستدعائها عند الحاجة.
على سبيل المثال، في Entity Framework رأيت أن في دوال مثل `.Where()` غالباً ما يستخدمون `Expression>`. لكن إذا كتبت `.Where(x => x.Age > 18)`، فإن المترجم (compiler) يضع النوع المناسب تلقائياً. لماذا أحتاج إلى تحديد `Expression<>` بشكل صريح؟
لدي هذا الكود:
```csharp
Func square = x => x * x;
Console.WriteLine(square(5)); // 25
```
وهذا:
```csharp
Expression> squareExpr = x => x * x;
// كيف أستخدم هذا؟ لا يمكن استدعاؤه ببساطة.
```
أفهم أن `Expression<>` هو نوع من "شجرة التعبيرات" (expression tree)، لكن لا أستطيع استيعاب الفرق العملي. متى أحتاج إلى استخدام `Expression>`، ومتى يكون `Func` كافياً؟ ولماذا في بعض المكتبات...