ciao,
Max è il nome di un metodo e infatti puoi vedere che ha un tipo di ritorno T.
Si tratta della dichiarazione di un metodo generico, cioè che può funzionare con argomenti di vario tipo.
Tra parentesi tonde puoi appunto vedere che Max accetta un solo parametro di tipo IEnumerable<T>, dove T è un tipo qualsiasi che implementi l'interfaccia IComparable, come disposto dalla restrizione
where T : IComparableT non è una parola chiave, puoi rinonimarla come vuoi. Di solito si usa T e quando sono coinvolti più tipi si usa U, V, ecc.. ma nulla ti vieterebbe di usare nomi più significativi come TSource, TEntità, e così via.
Max è un metodo statico, il che mi fa pensare che sia un extension method, anche se non vedo la parolina
this prima dell'argomento.
L'istruzione default(T) restituisce il valore di default per il tipo T.
Se T fosse un
value type, come ad esempio int o bool, restituirebbe rispettivamente 0 e false.
Se fosse invece un
reference type allora restituirebbe null.
E' un modo per inizializzare una variabile di cui non conosci esattamente il tipo.
public class SpeedComparer : IComparer<Vehicle>
Questa qui invece è una classe SpeedComparer che implementa l'interfaccia generica IComparer<T>. E' in questo punto che definisci che il tuo T deve essere Vehicle.
Tutti i membri definiti in IComparer<T> dovrai implementarli sostituendo Vehicle ad ogni occorrenza di T.
ciao