That doesnt however explain  to me why (null + null) will result in string.Empty (see IL below)

  IL_0000:  ldstr      ""
  IL_0005:  callvirt   instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()
  IL_000a:  call       void [mscorlib]System.Console::WriteLine(object)
  IL_000f:  call       string [mscorlib]System.Console::ReadLine()

I understand that overloaded string + operator is being called and nulls converted to "". But why string is chosen in the first place? IMO it should not be possible to compile this code at all...

Regarding my seconds example, C# compiler is being confused by the use of constructors and does no type checking, so that the following would still compile :

public string h = 56;
public DateTime k = 0;
public int i = "dfsf";
public Class1() : this(0)
{}

public Class1(int i) : this()
{}