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

これらの最初のものはnullセーフであることに注意してください。2番目はそうではありません。

ジェネリックスの完全な説明は、StackOverflowの回答の範囲をはるかに超えています。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 に答える