使用泛型 T 确定编译器选择的重载

本文关键字:编译器 选择 重载 泛型 | 更新日期: 2023-09-27 18:32:15

我有以下代码。计划是让GetSetting()根据T的类型调用适当的FromString()版本。

public static T GetSetting<T>(PersistedSetting setting, T defaultValue = default(T))
{
    return FromString(RegistrySettings.GetSetting(setting.ToString()) as string, defaultValue);
}
private static string FromString(string value, string defaultValue)
{
    return value ?? String.Empty;
}
private static int FromString(string value, int defaultValue)
{
    int i;
    return int.TryParse(value, out i) ? i : defaultValue;
}
private static decimal FromString(string value, decimal defaultValue)
{
    decimal d;
    return decimal.TryParse(value, out d) ? d : defaultValue;
}
private static bool FromString(string value, bool defaultValue)
{
    bool b;
    return bool.TryParse(value, out b) ? b : defaultValue;
}

但是,在调用FromString()的行上,我收到编译错误:

'ArticleManager.PersistedSettings.FromString(string, string)' 的最佳重载方法匹配有一些无效参数

编译器假定 FromString(string, string) .有没有办法让它对T使用适当的重载?

编辑:

我不确定,但我对正在发生的事情的最佳猜测是重载是在编译时确定的,而GetSetting()直到运行时才知道类型。但是,如果这就是问题所在,那么如何解决这个特定问题呢?

使用泛型 T 确定编译器选择的重载

重载选择确实发生在编译时。这就是问题所在。

您可以使用dynamic在运行时实现它:

return FromString(RegistrySettings.GetSetting(setting.ToString()) as string, (dynamic)defaultValue);

阅读有关 MSDN 的更多信息:使用类型 dynamic(C# 编程指南)

或者你可以让你的方法成为非泛型方法,并为GetSetting设置一组重载,例如

public static int GetSetting(PersistedSetting setting, int defaultValue = default(int))
{
    return FromString(RegistrySettings.GetSetting(setting.ToString()) as string, defaultValue);
}