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#中的泛型不如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)
你会想看看泛型。句法:
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)
希望这可以帮助,
问候, 托马斯
你的代码会变成这样:
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)