似乎C#不支持类似于C++的模板。例如:
template <class myType>
myType GetMax (myType a, myType b) {
return (a>b?a:b);
}
我希望我的函数的返回类型基于其参数,如何在C#中实现此目标?如何在C#中使用模板?编辑:我可以使用object和getType来实现几乎相同的目的吗?
似乎C#不支持类似于C++的模板。例如:
template <class myType>
myType GetMax (myType a, myType b) {
return (a>b?a:b);
}
我希望我的函数的返回类型基于其参数,如何在C#中实现此目标?如何在C#中使用模板?C++中最接近模板的语法在C#中被称为泛型,但它们并不是非常相似。特别地,你不能在泛型类型值之间使用像>
这样的运算符,因为编译器不知道它们(也无法基于运算符约束类型)。另一方面,你可以写:
public T GetMax<T>(T lhs, T rhs)
{
return Comparer<T>.Default.Compare(lhs, rhs) > 0 ? lhs : rhs;
}
或者
public T GetMax<T>(T lhs, T rhs) where T : IComparable<T>
{
return lhs.CompareTo(rhs) > 0 ? lhs : rhs;
}
C#中的泛型并不像C++中的模板那样强大。您想要实现的内容在C#中无法实现。
针对您的情况,可以使用一个hack/解决方法:
public T GetMax<T>(T a, T b) where T: IComparable {
if(a.CompareTo(b) > 0) {
return a;
}
return b;
}
public T GetMax<T>(T a, T b) where T : IComparable<T>
{
return a.CompareTo(b) > 0 ? a : b;
}
public class MyType<T>
{
}
您需要查看泛型。语法:
public T GetMax<T>(T a, T b) {
return (a>b?a:b);
}
更新:因为有些评论,我只想提供一个非常简要的概述。是的,我猜它不能正确编译或执行。但这是这个想法的基本样子。您将在此主题上找到更完整的回复-同时。
执行语法:
int a = 5;
int b = 10;
int result = GetMax(a, b);
泛型!
class MyClass<T> where T : IEnumerable (any parent class here!)
{
T myGeneric {get; set;}
}
public static IEnumerable<TResult> SelectIfNotNull<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)
{
if (source == null) return null;
return source.Select(selector);
}