繁体   English   中英

C#如何从通用代码调用函数

[英]C# How to call function from generic code

我是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");
    }
}

能否请您解释一下为什么我不能叫DoSomethingElseDoSomething 如何将value转发给接受该特定类型的另一个函数?

这可能不是最干净的处理方式,但是您可以强制使用dynamic 问题是,如果没有为T类型实现任何方法,则该方法将在运行时崩溃。 通过将约束添加到通用参数 ,您也许可以稍微缩小该问题。

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

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

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

即,使用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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM