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);
}