void Main()
{
var list = new[] {"1", "2", "3"};
list.Sum(GetValue); //error CS0121
list.Sum(s => GetValue(s)); //works !
}
double GetValue(string s)
{
double val;
double.TryParse(s, out val);
return val;
}
爲CS0121錯誤的描述是
呼叫是下列方法或屬性之間曖昧:
'System.Linq.Enumerable.Sum<string>(System.Collections.Generic.IEnumerable<string>, System.Func<string,decimal>)'
和'System.Linq.Enumerable.Sum<string>(System.Collections.Generic.IEnumerable<string>, System.Func<string,decimal?>
)」
我不明白的是,什麼在形成不s => GetValue(s)
給編譯器,根本GetValue
不 - 不是前者,後者的語法糖?
如果你有時間機器,你會如何改變它們?你會讓他們考慮返回類型,比如lambdas?或者你會做出不同的微妙變化? – configurator
有趣!我在LinqPad中玩過它,事實上,即使我有'double D1(string s)'和'int D1(string s)',具有'string M(string)'簽名的方法組也會產生一個模糊的調用錯誤 - 即使兩個簽名都不適合。這與lambda相反,它會嘗試所有這些,並在它嘗試的最後一個(第一個?)給它一個轉換錯誤。 –
但是,如果沒有重載解析問題(並且使用了錯誤的簽名),則方法組錯誤(「M具有錯誤的返回類型」)比lambda(「不能隱式轉換類型」字符串「 '雙'」) –