【发布时间】:2014-11-27 07:22:07
【问题描述】:
我有以下代码。计划是让GetSetting() 调用适当版本的FromString(),具体取决于T 的类型。
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() 直到运行时才知道类型。但是,如果这是问题所在,人们将如何解决这个特定问题?
【问题讨论】:
-
编译器如何知道您不会使用 DateTime、long 或 Foo 调用 GetSetting?
-
@AnthonyPegram:嗯,这是一个有效的问题,但就目前而言,它似乎是一个单独的问题。现在,它假设我总是用一个字符串来调用它。不确定我是否理解为什么会发生这种情况,或者做我想做的事情的最佳方式。
-
并不总是假设你用一个字符串来调用它,它只是从几个中选择一个作为有效的错误消息。事实是您的参数是 (string, T),并且您的重载都没有该签名,编译器只能拉出一个重载以包含在消息中。
-
如果您没有 (string, string) 重载,编译器将简单地选择另一个重载以包含在错误消息中,因为它再次找不到任何适用的内容。
-
@AnthonyPegram:好的,我可以看到。谢谢。
标签: c# .net generics overloading