Thursday, March 14, 2013

C# Type Inference In Generic Methods

As you may already know, C# compiler don’t support type inference for generic classes, but it supports type inference for generic methods. To illustrate the point, let us consider a very simple example
class Program
    {
        //Our generic IsGreaterThan method
        public static bool IsGreaterThan<T>(T x, T y) where T : IComparable<T>
        {
            return (x.CompareTo(y) > 0);
        }

        static void Main(string[] args)
        {
            //You don't need to explicitly specify IsGreaterThan<int>
            var result = IsGreaterThan(20,10);
            Console.WriteLine(result); 
        }
 }


As you can see, we are not specifying the type explicitly, while calling our IsGreaterThan method - it is inferred automatically by the compiler. That is simple, isn’t it? Now, things become a a bit more interesting when you combine Generic method type inference with extension methods. Have a look at this code, we just made our IsGreaterThan<T> method an extension method.

public static class UtilExtensions
    {
        //Our generic IsGreaterThan extension method
        public static bool IsGreaterThan<T>(this T x, T y) where T : IComparable<T>
        {
            return (x.CompareTo(y) > 0);
        }      
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            //You still don't need to explicitly specify IsGreaterThan<int>
            var result = 20.IsGreaterThan(10);
            Console.WriteLine(result);

        }

    }

As you can see, we are still good - the compiler can still infer the types. And of course, you can leverage our IsGreaterThan against any IComparable implementation.
Ref: http://www.amazedsaint.com/2010/10/c-type-inference-in-generic-methods.html