Search code examples
c#.nettype-inference

C# compiler type inference difference between inline method call and separate method call


It seems like the C# compiler infers types differently depending on how a method is called:

void Foo<T>() where T : Bar
{
   var instance = new T()
   {
      ID = 1
   }.
   ExtensionMethod();
}

In this case the compiler seems to infer that the type of instance is Bar, because I have a class Bar where ExtensionMethod is declared.

void Foo<T>() where T : Bar
{
   var instance = new T()
   {
      ID = 1
   };
   instance.ExtensionMethod();
}

In this case the compiler infers that the type of instance is T, which is what I would expect it to do in the first case as well. Why is there such a difference?


Solution

  • In the first case, you assign the result of the method call to instance. In the second case you discard the call's result. Instead, you assign the new T This is the only difference.