Seltsames Verhalten ändert sich mit der Kombination von var, dynamic und linq
Ich habe (träge) benutztvar
in der Originalversion des folgenden Codes und bekam eine seltsame Laufzeitausnahme in einem ganz anderen Teil des Codes. Durch Ändern von "var" in "int" wurde die Laufzeitausnahme behoben, aber ich kann nicht genau verstehen, warum. Ich habe den Code auf dieses Beispiel reduziert.
public class Program
{
private static List<string> Test(string i) { return new List<string> {i}; }
private static dynamic GetD() { return 1; }
public static void Main()
{
int value1 = GetD(); // <-- int
var result1 = Test("Value " + value1);
// No problem, prints "Value 1", First() on List<string> works ok.
Console.WriteLine(result1.First());
var value2 = GetD(); // <-- var
var result2 = Test("Value " + value2);
// The below line gives RuntimeBinderException
// 'System.Collections.Generic.List<string>' does not contain a
// definition for 'First'
Console.WriteLine(result2.First());
}
}
Ich kann sehen, dass der Typ des "var" dynamisch anstelle von int ist, aber warum verbreitet sich dieser Typ und beeinflusst das Verhalten des Rückgabewerts des Aufrufs anTest()
?
EDIT: Vielleicht sollte ich meine Frage klären; Ich kann sehen, dassdynamic
propagiert zuresult2
Was ich nicht verstehen kann ist, warum, wenn die IDE dies deutlich anzeigtList<string> Test(string)
Wird die Methode aufgerufen, so leitet sie den Rückgabewert trotzdem als dynamisch ab. Ist die IDE schlauer als der Compiler?