2010-12-02 13 views

答えて

11

いいえ、申し訳ありません。これには、C#がサポートする機能ではない汎用フィールドまたは汎用プロパティが必要です。あなたができる最善のは、T紹介する一般的な方法で行うことである。

public Func<IList<T>, T> SelectionMethod<T>() { return list => list.First(); } 

をそして今、あなたが言うことができます。

Func<IList<int>, int> selectInts = SelectionMethod<int>(); 
5
することができますもちろん

が、Tが知られている必要があります

public Func<IList<T>, T> SelectionMethod<T>() 
{ 
    return list => list.First(); 
} 
:あなたはジェネリック含むクラスを作成したくない場合は、汎用的なメソッドを使用することができます別の方法として

class Foo<T> 
{ 
    public Func<IList<T>, T> SelectionMethod = list => list.First(); 
} 

しかし、まだコンパイル時に誰かがこれを知る必要がありますT

+0

ええ、それは問題です。私はTが何であるか分からない。それはcharか文字列です。 – mpen

+0

さて、 'Foo 'クラスのコンシューマ(それをインスタンス化するコンシューマ)がそれを知っていることをうれしく思います。あなたがコンパイル時にそれを知らないなら、ジェネリックスはあなたのための正しい人工物ではありません。 –

+2

それでは、メソッドまたはクラスはジェネリックパラメータ 'T'を取らなければなりません。 – cdhowie

1

戻り値の型のみを汎用として宣言しました。

はこれを試してみてください:

public Func<IList<T>, T> SelectionMethod<T>() { return list => list.First(); } 

それは一般的なことのためにあなたが宣言されているものの名​​前が型パラメータを含める必要があります。コンパイラは汎用クラスと汎用メソッドのみをサポートしています。

ので、一般的なクラスのためにあなたは

class MyGeneric<T> { 
    // You can use T here now 
    public T MyField; 
} 

あるいは、方法

public T MyGenericMethod<T>(/* Parameters */) { return T; } 

のためにあなたはそれが最初のメソッド名で宣言された場合にのみ、リターンパラメータとしてTを使用することができますを持っている必要があります。

戻り値の型が実際のメソッドの前に宣言されているように見えますが、コンパイラはそのようには解釈しません。

+0

Eh?いいえ、私は編集の前ではなかった。それと何が関係していますか? – mpen

+0

それはより良い説明です。私はジェネリックラムダを望んでいましたが、私は存在しないと思います。 – mpen

0
public static void SomeContainerFunction() 
    { 
     const string NULL_VALUE = (string)null; 

     Type GetValueType<T>(T value) => value?.GetType() ?? typeof(T); 

     var typeOfNullValue = GetValueType(NULL_VALUE); 

     Debug.WriteLine($"Value: {NULL_VALUE}, Type: {typeOfNullValue}"); 
    } 
+1

ようこそ。質問に答えるときは、コードに関連する説明を記入してください。あなたのコードを理解していない人もいるかもしれませんし、質問にどのように答えるか分からない人もいます。 [良い答えを書く方法](https://stackoverflow.com/help/how-to-answer)を参照してください。 – Nuageux

関連する問題