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

标签 c# .net generics overloading

我有以下代码。 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() 的那一行,我得到了编译错误:

The best overloaded method match for 'ArticleManager.PersistedSettings.FromString(string, string)' has some invalid arguments

编译器采用FromString(string, string)。有没有办法让它为 T 使用适当的重载?

编辑:

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

最佳答案

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

您可以使用 dynamic 使其在运行时发生:

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

在 MSDN 上阅读更多信息:Using Type dynamic (C# Programming Guide)

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

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

关于c# - 使用泛型 T 确定编译器选择的重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27165158/

相关文章:

c# - 相继执行多个请求时出现 MySql 异常

c# - Dapper 异常 - 当 "The ConnectionString property has not been initialized"为 'buffered' 时为 'false'

c# - Thread.Sleep(0) 会放弃获得的 CPU 资源吗?

.net - Microsoft ACE 驱动程序更改了程序其余部分的浮点精度

c# - Properties.Settings.Default 自定义列表类型未保存!

java - 具有大量数据库表的通用实现

c# - wpf - 根据条件从 MS Access 数据库中选择数据

c# - .Net 中最简单的唯一标识符是什么?

Java FX-8 : Why is EventType generic?

java - 为什么方法接受协变类型的匿名泛型类对象?