1

这是我的代码的简化版本(我只需要线索即可)。

假设我有一个接口:

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)重复的问题

4

3 回答 3

1

你的方法的问题是:它从哪里得到适当的实现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-08T13:38:49.593 回答
1

好的,我已经第二次重写了我的答案,因为我知道你为什么认为你的代码可以工作。如果您认为int类型会自动实现您的IParse<T>接口,那么您误解了泛型/接口的工作方式。int.Parsedecimal.Parse等等)是静态的,所以它不能实现接口成员。这是可以使用 C++ 模板完成的事情,但不能使用 C#(或 Java)泛型。

一种解决方案是使用委托。它不像您正在寻找的那样优雅,但也不错:

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-08T13:06:19.647 回答
0

也许这

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
}
于 2013-09-08T11:48:39.833 回答