2017-10-23 8 views
0

関数にオプションの汎用パラメータを使用する必要があります。これは、一般的なパラメータを使用せずに通常の関数のようになります。私は必要なものオプションの汎用パラメータ

void MyFunction (string myText, int optionalParameter = 0) 
{ 
//Do something 
} 

はこれです:

void MyFunction<T> (string myText, T optionalGenericParameter = default(T)) 
{ 
    //Do something 
} 

残念ながらdefault(T)への初期化は、次のようなエラー「の使用から推測することはできませんが投げているお試しください。型引数を明示的に指定します。

+1

さてあなたはこのようにそれを呼び出す必要があります'MyFunction (" test ")'またはこの 'MyFunction(" test "、1)'のように、そうでなければコンパイラは 'T'の型を推測する方法がありません。 – Evk

答えて

0

optionalGenericParameterの値を渡した場合、コンパイラはその型が何であるかを知るでしょう。代わりに、明示的に、たとえば、タイプを指定する必要があります。

MyFunction<string>("Hello world"); 
+0

ありがとうございます、それはそのオプションを(普通のジェネリックの)オプションにして、0のように渡す方が良いという意味ですか?また、もし3つの選択肢があれば、それはこのように見えるでしょうか? MyFunction ( "Hello World"); – CosmicSeizure

+0

値を渡すと、型をそれ以上指定する必要がなくなり、コンパイラがそれを推論することができます。メソッドに追加のジェネリック型がある場合は、1つしか推論できない場合は、すべてを指定する必要があります。 – DavidG

1

2番目のパラメータを指定しないと、メソッドを呼び出すときに型を指定する必要があります。

エラーは、コンパイラがメソッドを呼び出すときにタイプ Tが何であるかを推測することができないことを言っている
// correct 
MyFunction<SomeType>("hello"); 

// NOT correct 
MyFunction("hello"); 
1

私は私が何をすべきか、やや多くの場合、この問題が発生している...過負荷

void MyFunction (string myText) 
{ 
    MyFunction (myText, 0); 
    // this works because C# will infer T as being int 
} 

void MyFunction<T> (string myText, T optionalGenericParameter) 
{ 
    //Do something 
} 

/* usage example: 
MyFunction("foo"); 
MyFunction("bar", new Tuple<string, int>("yay", 113)); 
// C# will infer that T is Tuple<string, int> here. 
*/ 
+0

それはかなり良い解決、ありがとう。 – CosmicSeizure