私は(怠惰に)var
以下のコードの元のバージョンで使用し、コードのまったく異なる部分で奇妙なランタイム例外を受け取りました。「var」を「int」に変更すると、ランタイム例外が修正されましたが、その理由がよくわかりません。コードをこの例に要約しました。
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());
}
}
「var」の型がintではなく動的であることがわかりますが、なぜその型がに伝播し、への呼び出しの戻り値の動作に影響を与えるのTest()
ですか?
編集:たぶん私は私の質問を明確にする必要があります。にdynamic
伝播するresult2
ことがわかりますが、理解できないのは、IDEがList<string> Test(string)
呼び出されたメソッドであることを明確に示している場合でも、戻り値が動的であると推測する理由です。IDEがコンパイラよりも賢い場合ですか?