C# 从bool到通用接口的装箱转换<;T>;

C# 从bool到通用接口的装箱转换<;T>;,c#,generics,casting,boxing,C#,Generics,Casting,Boxing,这是我的代码的简化版本(我只需要继续下去的线索) 假设我有一个接口: public interface IParse <T> { bool TryParse (string value, out T result); } 我无法使用此语法: Class.GetParsedValueOrDefault<bool>("False"); //Error Class.GetParsedValueOrDefault(“False”)//错误 我得到一个错误: Ther

这是我的代码的简化版本(我只需要继续下去的线索)

假设我有一个接口:

public interface IParse <T>
{
    bool TryParse (string value, out T result);
}
我无法使用此语法:

Class.GetParsedValueOrDefault<bool>("False"); //Error
Class.GetParsedValueOrDefault(“False”)//错误
我得到一个错误:

There is no boxing conversion from 'bool' to 'IParse<bool>'
没有从“bool”到“IParse”的装箱转换
我如何才能使这种或任何建议的类似方法发挥作用

p/S:嘿,搜索大师,请给我指出一个问题,它是(tnx)的复制品,可能是这个

public static bool GetParsedValueOrDefault<T>(string val, out T result)  where T : IParse<T>
{
    result = default(T);
    result.TryParse(val, out result);
    return result
}
公共静态bool GetParsedValueOrDefault(字符串val,out T result),其中T:IParse
{
结果=默认值(T);
结果:胰蛋白酶(val,out结果);
返回结果
}
但是有点奇怪

也许你的意思是:

public static T GetParsedValueOrDefault<T>(string val)  where T : IParse<T>
{
    var result = default(T);
    result.TryParse(val, out result);
    return result
}
public static T GetParsedValueOrDefault(string val),其中T:IParse
{
var结果=默认值(T);
结果:胰蛋白酶(val,out结果);
返回结果
}

好的,我已经第二次重写了我的答案,现在我明白了为什么你认为你的代码可以工作了。如果您认为
int
类型将自动实现您的
IParse
接口,那么您就误解了泛型/接口的工作方式
int.Parse
(和
decimal.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"
公共委托布尔解析器(字符串s,out T结果);
公共静态T GetParsedValueOrDefault(字符串val,解析器)
{
T结果;
bool success=parser(val,out结果);
返回成功?结果:默认为T;
}
//例子
int result=GetParsedValueOrDefault(“123”,int.TryParse);
Console.WriteLine(结果);//"123"
十进制结果=GetParsedValueOrDefault(“123.456”,decimal.TryParse);
Console.WriteLine(结果);//"123.456"
decimal结果=GetParsedValueOrDefault(“无效”,decimal.TryParse);
Console.WriteLine(结果);//"0.0"

您的方法的问题是:它从哪里获得了
IParse
的适当实现
IParse
是一个接口,您无法实例化接口,并且可能有几个类实现了
IParse

我建议您使用工厂方法:

public static class Parse
{
    public static IParse<T> Create<T>()
    {
        ...
        return ...;
    }
}
公共静态类解析
{
公共静态IParse创建()
{
...
返回。。。;
}
}
然后你的方法会这样做:

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);
}
public static T GetParsedValueOrDefault(string val)
{
IParse parser=Parse.Create();
T-ret;
if(parser.TryParse(val,out-ret)){
返回ret;
}
返回默认值(T);
}

bool类型将如何成为IParse类型?@DaveBish:既然bool类型有一个TryParse方法,我希望有一个工作方法来利用它。不,布尔结构应该继承你的接口才能工作,这是永远不会发生的。告诉我们你想实现什么。我们会帮助你的。谢谢朋友们,这正是我所需要的,一套由该领域熟练专家提供的宝贵提示。我需要一些时间来消化它们。请暂时接受我的+1,直到那时。
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);
}