C#中的模板函数 - 返回类型?

SMU*_*hah 18 c# templates function-templates

似乎c#不支持类似c ++的模板.例如

template <class myType>
myType GetMax (myType a, myType b) {
 return (a>b?a:b);
}
Run Code Online (Sandbox Code Playgroud)

我希望我的函数有基于其参数的返回类型,我如何在c#中实现这一点?如何在C#中使用模板

编辑:我可以使用object和getType几乎相同的目的?

Jon*_*eet 35

C#中最接近C++模板的是泛型 - 但它们并不是非常接近.特别是,你不能使用像运营商>泛型类型值之间,因为编译器不知道他们(和你无法约束基于运营商的类型).另一方面,你可以写:

public T GetMax<T>(T lhs, T rhs)
{
    return Comparer<T>.Default.Compare(lhs, rhs) > 0 ? lhs : rhs;
}
Run Code Online (Sandbox Code Playgroud)

要么

public T GetMax<T>(T lhs, T rhs) where T : IComparable<T>
{
    return lhs.CompareTo(rhs) > 0 ? lhs : rhs;
}
Run Code Online (Sandbox Code Playgroud)

请注意,其中第一个是空安全的; 第二个不是.

泛型的完整描述远远超出Stack Overflow答案的范围; MSDN有一些信息,或咨询您最喜欢的C#书.

  • 我听说 C# in Deep 对泛型有一些很好的解释:) (2认同)

Mat*_*eer 7

C#中的泛型不如C++中的模板强大.你想做什么在C#中不起作用.

针对您的情况的黑客/解决方法是

public T GetMax<T>(T a, T b) where T: IComparable {
    if(a.CompareTo(b) > 0) {
        return a;
    }
    return b;
}
Run Code Online (Sandbox Code Playgroud)


thm*_*shd 5

你会想看看泛型。句法:

public T GetMax<T>(T a, T b) {
    return (a>b?a:b);
}
Run Code Online (Sandbox Code Playgroud)

由于一些评论而更新......我只是想提供一个非常快速的概述。是的,我想它没有正确编译或执行。但这是关于这将是什么样子的基本想法。您会找到关于此主题的更完整的回复 - 同时。

执行语法:

int a = 5;
int b = 10;
int result = GetMax(a, b);
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助,

问候, 托马斯

  • 您不能以这种方式比较 a 和 b,因为编译器不知道 T 是什么。如果类型 T 不支持比较怎么办? (2认同)

Lee*_*Lee 5

你的代码会变成这样:

public T GetMax<T>(T a, T b) where T : IComparable<T>
{
    return a.CompareTo(b) > 0 ? a : b;
}
Run Code Online (Sandbox Code Playgroud)