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

时间:2010-06-15 21:12:37

标签: c# templates function-templates

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

template <class myType>
myType GetMax (myType a, myType b) {
 return (a>b?a:b);
}

我希望我的函数根据其参数返回类型,如何在c#中实现?如何在C#中使用模板

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

7 个答案:

答案 0 :(得分:33)

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;
}

请注意,其中第一个是空的;第二个不是。

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

答案 1 :(得分:6)

C#中的泛型不如C ++中的模板强大。你想做的事情在C#中不起作用。

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

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

答案 2 :(得分:2)

您在C#中使用Generics来获得类似功能的模板。

http://msdn.microsoft.com/en-us/library/ms379564(VS.80).aspx

public class MyType<T>
{
}

答案 3 :(得分:2)

您需要查看generics。语法:

public T GetMax<T>(T a, T b) {
    return (a>b?a:b);
}

更新,因为有些评论......我只想提供非常快速的概述。是的,我想它不能正确编译或执行。但这是关于它的外观的基本思路。你会在这个主题上找到更完整的回复 - 同时。

执行语法:

int a = 5;
int b = 10;
int result = GetMax(a, b);

希望这有帮助,

此致 托马斯

答案 4 :(得分:2)

您的代码会变成这样:

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

答案 5 :(得分:0)

泛型!

class MyClass<T> where T : IEnumerable (any parent class here!)
{
   T myGeneric {get; set;}
}

答案 6 :(得分:0)

你的意思是这样的事情

   public static IEnumerable<TResult> SelectIfNotNull<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)
   {
       if (source == null) return null;
       return source.Select(selector);
   }