Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#泛型<;T>;/约束问题_C#_.net - Fatal编程技术网

c#泛型<;T>;/约束问题

c#泛型<;T>;/约束问题,c#,.net,C#,.net,考虑以下例程,它通过构建一些默认行为(例如,无空值,不将“1,1,1”解析为有效数字)简化了我的生活: 然后对所有num类型重复此例程。我想把打字和打字错误都合并到一个文件中,这样可以节省打字和打字的时间 public static T CvtTo<T>(Object O) : where T : "is one of Int32, Int16 ..." 公共静态T CvtTo(对象O):其中T:“是Int32、Int16中的一个…” 通常的“where T:struct”约束在

考虑以下例程,它通过构建一些默认行为(例如,无空值,不将“1,1,1”解析为有效数字)简化了我的生活:

然后对所有num类型重复此例程。我想把打字和打字错误都合并到一个文件中,这样可以节省打字和打字的时间

public static T CvtTo<T>(Object O) : where T : "is one of Int32, Int16 ..."
公共静态T CvtTo(对象O):其中T:“是Int32、Int16中的一个…”
通常的“where T:struct”约束在这里是不够的,因为“return(T)0”语句对任意值类型无效。似乎应该有某种方法可以在不向后弯曲的情况下将其泛化,但我看不到。我错过了什么?

你做不到

NET中的泛型不是模板,它们只编译一次,因此必须在编译时合法,而不是在调用时合法


由于没有
where T:number
约束,或者没有
where T:op_add()
约束,因此不能仅使用泛型来实现这一点,您需要重载或运行时检查来实现这一点。

这是不可能的。请看这篇精彩的帖子:


您可以在where T:IConvertible中尝试,并将最后一行更改为返回Convert.ToDouble(O)?我确信所有的值类型都支持该接口。

< p>您可能需要考虑包含每个或列出的类型的扩展方法的静态类,以将CVTTO双()扩展方法提供给每个目标类型;p>
static class CvtToDoubleExtension
{
    static double CvtToDouble(this int arg)
    {
        return (double)arg;
    }

    static double CvtToDouble(this string arg)
    {
        return double.Parse(arg);
    }

    // Etc....
}
它没有您想要的泛型方法那么简洁,但是它只有1个类,然后CvtToDouble方法将可用于您想要的所有类型

string example = "3.1412";
double value = example.CvtToDouble();
string example = "3.1412";
double value = example.CvtToDouble();