69. Calling generic extension methods implicity

בהמשך לטיפ היומי של אתמול,

ראינו שאם יש לנו מתודה גנרית, ניתן להפוך אותה לExtension method:

1
public static T First<T>(this IEnumerable<T> enumerable)

ולקרוא לה כך:

1
2
3
4
5
6
7
8
9
10
11
IEnumerable<string> strings =
new string[]
{
"A new hope",
"The empire strikes back",
"The return of the Jedi"
};
string firstMovie = strings.First<string>(); // A new hope
char firstLetter = "The first letter is 'T'".First<char>();

ראינו בעבר (טיפ מספר 28) שאם יש לנו מתודה גנרית, ניתן לקרוא לה לרוב implicity, בלי ציון הפרמטרים:

1
2
3
string firstMovie = Utilities.First(strings); // A new hope
char firstLetter = Utilities.First("The first letter is 'T'");

הדבר נכון גם לגבי Extension Methods גנריים!

מאחר והקוד מתקמפל לאותו קוד נוכל לכתוב את הקוד הבא:

1
2
3
string firstMovie = strings.First(); // A new hope
char firstLetter = "The first letter is 'T'".First();

שימו לב ליופי שבדבר!

אם בפעם שעברה ראינו "שהוספנו" מתודה לכל IEnumerable<T> בלי לדעת בכלל מהו T, כעת אנחנו "הוספנו" מתודה לכל IEnumerable<T> ואנחנו בכלל לא צריכים לציין מהו T.

הדבר מאפשר לנו לקרוא בצורה מאוד נקייה לUtilities. שימו לב להבדל בקריאות בין הכתיבה הסטטית, לכתיבה של אתמול, לכתיבה החדשה.

כל המגבלות שאמרנו ביום ראשון על Extension Methods חלות גם פה (אי אפשר שניים עם אותה חתימה באותו שם באותו namespace וכו’), וכן המגבלות של הקומפיילר לפענח לבדו מהו T. (ראו גם הטיפ היום מספר 28)

המשך יום מורחב טוב

שתף