20

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

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

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

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

4

7 回答 7

40

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# 书籍。

于 2010-06-15T21:18:05.920 回答
7

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

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

public T GetMax<T>(T a, T b) where T: IComparable {
    if(a.CompareTo(b) > 0) {
        return a;
    }
    return b;
}
于 2010-06-15T21:18:53.637 回答
5

你会想看看泛型。句法:

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

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

执行语法:

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

希望这可以帮助,

问候,托马斯

于 2010-06-15T21:16:14.683 回答
3

你的代码会变成这样:

public T GetMax<T>(T a, T b) where T : IComparable<T>
{
    return a.CompareTo(b) > 0 ? a : b;
}
于 2010-06-15T21:18:48.447 回答
3

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

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

public class MyType<T>
{
}
于 2010-06-15T21:14:40.733 回答
1

泛型!

class MyClass<T> where T : IEnumerable (any parent class here!)
{
   T myGeneric {get; set;}
}
于 2010-06-15T21:15:20.530 回答
-1

你的意思是这样的

   public static IEnumerable<TResult> SelectIfNotNull<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)
   {
       if (source == null) return null;
       return source.Select(selector);
   }
于 2017-10-28T10:24:06.877 回答