我是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
转发给另一个接受该特定类型的函数?
答案 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时可以执行的活动。您可以使用is
和as
关键字解决此问题。
如果添加诸如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);
}
}