这是我的代码的简化版本(我只需要一些线索来继续)。
假设我有一个接口:
public interface IParse <T>
{
bool TryParse (string value, out T result);
}这是我的Class的一个方法
public static T GetParsedValueOrDefault<T>(string val) where T : IParse<T>
{
T ret = default (T);
ret.TryParse(val, out ret);
return ret
}我不能使用这个语法:
Class.GetParsedValueOrDefault<bool>("False"); //Error我得到了错误:
There is no boxing conversion from 'bool' to 'IParse<bool>'我如何才能使这种或任何建议的类似方法发挥作用?
P/S :嘿,搜索大师,请给我指出一个问题,它是(tnx)的副本
发布于 2013-09-08 21:06:20
好了,我已经第二次重写了我的答案,现在我意识到为什么你认为你的代码可以工作了。如果您认为int类型将自动实现您的IParse<T>接口,那么您误解了泛型/接口的工作方式。int.Parse (和decimal.Parse等)是静态的,所以它不能实现接口成员。这是可以使用Java完成的事情,但不能使用C# (或C++ )泛型完成。
一种解决方案是使用委托。它不像你想要的那样优雅,但也不是太糟糕:
public delegate bool Parser<T>(string s, out T result);
public static T GetParsedValueOrDefault<T>(string val, Parser<T> parser)
{
T result;
bool success = parser(val, out result);
return success ? result : default(T);
}
// Examples
int result = GetParsedValueOrDefault<int>("123", int.TryParse);
Console.WriteLine(result); // "123"
decimal result = GetParsedValueOrDefault<decimal>("123.456", decimal.TryParse);
Console.WriteLine(result); // "123.456"
decimal result = GetParsedValueOrDefault<decimal>("invalid", decimal.TryParse);
Console.WriteLine(result); // "0.0"发布于 2013-09-08 21:38:50
你的方法的问题是:它从哪里获得适当的IParse<T>实现?IParse<T>是一个接口,你不能实例化一个接口,可能有几个实现IParse<bool>的类。
我建议您使用工厂方法:
public static class Parse
{
public static IParse<T> Create<T>()
{
...
return ...;
}
}然后你的方法会这样做:
public static T GetParsedValueOrDefault<T>(string val)
{
IParse<T> parser = Parse.Create<T>();
T ret;
if (parser.TryParse(val, out ret)) {
return ret;
}
return default(T);
}发布于 2013-09-08 19:48:40
也许这是
public static bool GetParsedValueOrDefault<T>(string val, out T result) where T : IParse<T>
{
result = default(T);
result.TryParse(val, out result);
return result
}但是有点奇怪。
也许你的意思是:
public static T GetParsedValueOrDefault<T>(string val) where T : IParse<T>
{
var result = default(T);
result.TryParse(val, out result);
return result
}https://stackoverflow.com/questions/18683236
复制相似问题