Roadmap › C# Language — Basics to Advanced › Module: Methods and Functional C#
Lessons in this course (38)

24. Extension methods, generics and constraints

Intermediate★ Must knowLesson 24 of 38
csharp
public static class StringExtensions
{
    public static bool IsEmail(this string s) => s.Contains('@');   // call as "x@y.com".IsEmail()
}

public class Repository<T> where T : class, IEntity, new()
{
    private readonly List<T> _items = [];
    public T Create() { var t = new T(); _items.Add(t); return t; }
}

T Max<T>(T a, T b) where T : IComparable<T> => a.CompareTo(b) >= 0 ? a : b;

Constraints: where T : class, struct, new(), notnull, unmanaged, a base class, an interface, or T : U.

Covariance / contravariance: IEnumerable<out T> lets IEnumerable<string> be used as IEnumerable<object>; Action<in T> lets Action<object> be used as Action<string> — see the next lesson.