首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从bool到泛型interface<T>的装箱转换

从bool到泛型interface<T>的装箱转换
EN

Stack Overflow用户
提问于 2013-09-08 19:38:55
回答 3查看 1.3K关注 0票数 1

这是我的代码的简化版本(我只需要一些线索来继续)。

假设我有一个接口:

代码语言:javascript
复制
public interface IParse <T>
{
    bool TryParse (string value, out T result);
}

这是我的Class的一个方法

代码语言:javascript
复制
public static T GetParsedValueOrDefault<T>(string val)  where T : IParse<T>
{
        T ret = default (T);
        ret.TryParse(val, out ret);
        return ret
}

我不能使用这个语法:

代码语言:javascript
复制
Class.GetParsedValueOrDefault<bool>("False"); //Error

我得到了错误:

代码语言:javascript
复制
There is no boxing conversion from 'bool' to 'IParse<bool>'

我如何才能使这种或任何建议的类似方法发挥作用?

P/S :嘿,搜索大师,请给我指出一个问题,它是(tnx)的副本

EN

回答 3

Stack Overflow用户

发布于 2013-09-08 21:06:20

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

一种解决方案是使用委托。它不像你想要的那样优雅,但也不是太糟糕:

代码语言:javascript
复制
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"
票数 1
EN

Stack Overflow用户

发布于 2013-09-08 21:38:50

你的方法的问题是:它从哪里获得适当的IParse<T>实现?IParse<T>是一个接口,你不能实例化一个接口,可能有几个实现IParse<bool>的类。

我建议您使用工厂方法:

代码语言:javascript
复制
public static class Parse
{
    public static IParse<T> Create<T>()
    {
        ...
        return ...;
    }
}

然后你的方法会这样做:

代码语言:javascript
复制
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);
}
票数 1
EN

Stack Overflow用户

发布于 2013-09-08 19:48:40

也许这是

代码语言:javascript
复制
public static bool GetParsedValueOrDefault<T>(string val, out T result)  where T : IParse<T>
{
    result = default(T);
    result.TryParse(val, out result);
    return result
}

但是有点奇怪。

也许你的意思是:

代码语言:javascript
复制
public static T GetParsedValueOrDefault<T>(string val)  where T : IParse<T>
{
    var result = default(T);
    result.TryParse(val, out result);
    return result
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18683236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档