我编写了一个将字典内容写入Excel工作表的通用方法。泛型工作非常好,因为Excel范围对象是dynamic
,因此它可以无缝地处理我扔进字典中的任何基本数据类型。
在这样做的过程中,我注意到函数被调用的方式让我意外。我想在这里询问是否有一种首选的处理方法。
这是功能:
private void WriteDictionary<T,U>(Excel.Range startCell, int keyColumnOffset, int valueColumnOffset, Dictionary<T,U> dictionary)
{
int row = 0;
foreach (KeyValuePair<T, U> value in dictionary)
{
startCell.Offset[row, keyColumnOffset].Value = value.Key;
startCell.Offset[row, valueColumnOffset].Value = value.Value;
row++;
}
}
工作正常。让我感到惊讶的是调用函数的方式。我希望我需要使用类似的东西来调用它(即在函数调用中提供类型参数):
WriteDictionary<DateTime, double>(outputTemplate.Worksheets[1].Range["A2"], 0, 1, myForecastDictionary);
但我发现我实际上可以这样称呼它:
WriteDictionary(outputTemplate.Worksheets[1].Range["A2"], 0, 1, myForecastDictionary);
显然,它可以从字典中的类型参数推断出所需的类型参数。我想当我想到它时,编译器可以做到这一点并不令人惊讶。
我的问题是:通过直接提供类型来调用函数是否更好/更有效(引擎盖下)?或者编译器基本上是在编译时工作,并实际生成相同的代码?
答案 0 :(得分:2)
编译器可以根据您传入的方法参数推断类型参数;它不能仅从约束或返回值推断类型参数。因此,类型推断不适用于没有参数的方法。 类型推断在编译时发生,然后编译器尝试解析重载的方法签名。编译器将类型推断逻辑应用于共享相同名称的所有通用方法。在重载解析步骤中,编译器仅包括那些类型推断成功的泛型方法。
所以,它会是一样的。