C#如何从通用代码

时间:2017-04-04 15:48:56

标签: c# generics

我是C#的新手,我正在尝试创建泛型类型调度程序(类似C ++),但看起来我无法使用泛型参数调用函数:

示例代码:

class Program
{
    static void Main(string[] args)
    {
        DoSomething(1);
    }

    static void DoSomething<T>(T value)
    {
        //error CS1503: Argument 1: cannot convert from 'T' to 'int'
        DoSomethingElse(value);
    }

    static void DoSomethingElse(int a)
    {
        Console.Write("int\n");
    }

    static void DoSomethingElse(float a)
    {
        Console.Write("float\n");
    }
}

请解释为什么我无法从DoSomethingElse致电DoSomething? 如何将value转发给另一个接受该特定类型的函数?

2 个答案:

答案 0 :(得分:3)

这可能不是处理它的最简洁方法,但你可以转为dynamic。 问题是,如果没有为T类型实现的方法,它将在运行时崩溃。您可以通过添加constraint to your generic parameter来缩小该问题。

static void DoSomething<T>(T value) where T : struct
{
    DoSomethingElse((dynamic)value);
}

答案 1 :(得分:1)

没有任何约束,只允许您执行value类型为object时可以执行的活动。您可以使用isas关键字解决此问题。

如果添加诸如where T : IComparable之类的where约束,则允许使用满足约束的方法和属性。

即。使用IComparable约束,您可以调用value.CompareTo(x)

static void DoSomething<T>(T value)
{
    if (value is int)
    {
        DoSomethingElse((value as int?).Value);
    }
    else if (value is float)
    {
        DoSomethingElse((value as float?).Value);
    }
    else
    {
        throw new Exception("No handler for type " + typeof(T).Name);
    }
}