作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试在 C# 中创建一个通用方法,它将根据其主体中的参数数据类型调用不同的方法,然后处理它们的结果。我试图通过创建通用包装器方法来实现这一点,然后提供处理方法的多个重载 - 包括在没有特定重载可用时将使用的通用方法。
当我直接调用处理方法时,正确选择了合适的版本。但是,当我从包装器方法调用它时,它总是选择通用方法,即使我传递给它的特定数据类型有匹配的重载。
有什么方法可以调整代码以使其按照我需要的方式运行吗?或者我必须使用不同的方法。
我需要代码与 Mono 2.6 兼容。
using System;
class Program
{
static void Func<T>(T val)
{
Console.WriteLine("Generic Func");
}
static void Func(int val)
{
Console.WriteLine("Int Func");
}
static void Func(string val)
{
Console.WriteLine("String Func");
}
static void FuncWrap<T>(T val)
{
Console.Write("Wrap: ");
Func(val);
}
static void Main(string[] args)
{
Func(2);
Func("Potato");
Func(2.0);
FuncWrap(2);
FuncWrap("Potato");
FuncWrap(2.0);
Console.Read();
}
}
最佳答案
Is there any way correct this behavior?
根据 C# 语言规范,这已经是正确的行为。在 FuncWrap
中调用的 Func
的重载通常在编译时确定,因此它不能选择不同的 Func
基于执行时类型的重载。
然而,改变行为的一种方法是使用动态类型:
static void FuncWrap<T>(T val)
{
Console.Write("Wrap: ");
dynamic x = val;
Func(x);
}
现在将根据 x
值的实际 类型在执行时执行重载解析。这会产生性能成本,但应该按照您的意愿进行。
或者,您可以对重载的知识进行硬编码:
static void FuncWrap<T>(T val)
{
Console.Write("Wrap: ");
if (typeof(T) == typeof(string))
{
Func((string)(object)val);
}
else if (typeof(T) == typeof(int))
{
Func((int)(object)val);
}
else
{
Func(val);
}
}
虽然这显然非常可怕。
关于C#:泛型方法不调用特定方法重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25685471/
我是一名优秀的程序员,十分优秀!