Type Inference in C#

Type Inference in C# 

C# is a strongly typed language and the default type declaration is explicit type. For example, the following code snippet declares and initializes two variables. The first variable, name, is a string type variable and the second variable, age, is an integer type variable. 

string name = "Mahesh Chand";
int age = 25; 

If I add this line of code below the code above: 

name = 32; 

Then the compiler throws the following error:

Cannot implicitly convert type 'int' to 'string'. 

C# 3.0 introduced a var keyword that can be used to declare implicit types. The purpose of implicit types is to store any type in a variable. 

The following code snippet declares an implicit variable that stores a string. 

var name = "Mahesh Chand"; 

Once an implicit type is defined, the compiler knows the type of the variable. You cannot assign another type of value to it. For example, if we write this code: 

name = 25; 

Then the compiler throws the following error:

Cannot implicitly convert type 'int' to 'string'.

In C#, the var keyword tells the compiler to use the type inference to determine the type of a variable. Type inference is heavily used in LINQ queries so any type can be stored in the variable. 

The following is the Author class: 

public class Author
{
    public string Name { get; set; }
    public string Book { get; set; }
    public string Publisher { get; set;}
    public Int16 Year { get; set; }
    public double Price { get; set; }
} 

The following code creates a list of authors and uses LINQ to query the authors list. 

List<Author> authorsList = new List<Author>{
            new Author(){ Name="Mahesh", Book="ADO.NET Programming",
                Publisher="Wrox", Year=2007, Price=44.95 },
            new Author(){ Name="Raj", Book="LINQ Cookbook",
                Publisher="APress", Year=2010, Price=49.95 },
            new Author(){ Name="Praveen", Book="XML Code",
                Publisher="Microsoft Press", Year=2012, Price=44.95 }
        }; 

var authorQuery = from author in authorsList
                    where author.Price == 44.95
                    select new { author.Name, author.Publisher }; 

// In case of an anonymous type, a var must be used
foreach (var author in authorQuery)
{
    Console.WriteLine("Name={0}, Publisher={1}", author.Name, author.Publisher);
}

Summary

C# is a strongly typed language, but in C# 3.0 a new feature was introduced to minimize the impact of being a strongly typed language. The feature is called type inference and the keyword used is the "var" keyword. In this article, we learned what type inferance is and how it may be used in your code.