C#はテンプレートのようなc ++をサポートしていないようです。例えば
template <class myType>
myType GetMax (myType a, myType b) {
return (a>b?a:b);
}
関数にパラメーターに基づいた戻り値の型を持たせたいのですが、C#でこれをどのように実現できますか? C#でテンプレートを使用する方法
編集:オブジェクトとgetTypeをほぼ同じ目的で使用できますか?
C#のC++テンプレートに最も近いのはジェネリックスですが、veryほどではありません。特に、ジェネリック型の値の間に>
のような演算子を使用することはできません。これは、コンパイラーがそれらについて知らないためです(そして演算子に基づいて型を制約することはできません)。一方、あなたは書くことができます:
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つ目は違います。
ジェネリックの完全な説明は、スタックオーバーフローの回答の範囲をはるかに超えています。 [〜#〜] 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;
}
generics を確認してください。構文:
public T GetMax<T>(T a, T b) {
return (a>b?a:b);
}
[〜#〜] update [〜#〜]いくつかのコメントのため...非常に速い概要。ええ、私はそれが正しくコンパイルまたは実行されないと思います。しかし、これはこれがどのように見えるかについての基本的な考え方です。その間、このトピックに関するより完全な返信が見つかります。
実行構文:
int a = 5;
int b = 10;
int result = GetMax(a, b);
お役に立てれば、
よろしく、トーマス
C#でジェネリックを使用して、テンプレートのような機能を取得します。
http://msdn.Microsoft.com/en-us/library/ms379564(VS.80).aspx
public class MyType<T>
{
}
コードは次のようになります。
public T GetMax<T>(T a, T b) where T : IComparable<T>
{
return a.CompareTo(b) > 0 ? 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);
}