2012-02-20 8 views
0

T>型のコレクション<を返す関数があります。 Collectionオブジェクトが毎回異なるため、関数の戻り値の型が汎用である必要があることを意味します。しかし、コレクション< T>戻り値の型は "Tが認識できない、参照がありませんか?"というエラーを返します。関数をpublic staticコレクション< T> func_name()として宣言したとき。コレクションとして戻り値型を持つ関数のバイパス<T>

これを回避する方法はありますか?

おかげで...

答えて

1

public static Collection<T> func_name<T>() 

として、それを宣言します。これは、C#で 'ジェネリック' と呼ばれ、C++テンプレートクラス/関数に似ていています。 this MSDN articleには、C#のジェネリックに関するいくつかの基本的な情報や役に立つリンクがあります。関数がすでにジェネリックパラメータTを持つクラス内で定義されている場合

3

はあなたが書くことができないあなたは第2のTをドロップすることができ

public static Collection<T> func_name<T>() ... 

としてそれを宣言する必要があります。

public static Collection<T> func_name() 
{ 
    // Implementation 
} 

関数はどのような型を返すべきかをどのように知っていますか?あなたはそれを指定することがTの種類が必要であることをメソッド宣言で指定する必要が

:いくつかのケースである

public static Collection<T> func_name<T>() 
{ 
    // Implementation 
} 

... 

Collection<string> obj = func_name<string>(); 

注意を、コンパイラは(使用されるタイプを推測することができますそれはタイプ推論と呼ばれています)。これは、メソッドの宣言を変更しませんが、それは単にメソッドの使用方法は、することができます:

public static Collection<T> func_name<T>(T param) 
{ 
} 

private static void Main(string[] args) 
{ 
    string paramAsString = string.Empty; 

    // Type inference here: the compiler know which is the type 
    // represented by T as the parameter of the method that must 
    // be of type T is a string (so, for the compiler, T == string) 
    // That's why in this example it's not required to write: 
    // var obj = func_name<string>(paramAsString); 
    // but following is enough: 
    // var obj = func_name(paramAsString); 
    Collection<string> obj = func_name(paramAsString); 

    Console.ReadLine(); 
} 

私はあなたがgenerics in C#に外観を持つことを示唆しています。

0

ご協力いただきありがとうございます。

私はそれを汎用化するために関数をシリアライズすることに決めました。

関連する問題