2012-03-27 17 views
7

次のメソッドシグネチャがあると、コンパイラがその型を自動的に推論できないというパラメータが明示的に指定されているのはなぜですか? Visual Studio 2010 SP1では、型を推測でき、警告やエラーが表示されません。 CannotInferTypeに説明し、それをコンパイルしようとすると、コンパイラは予想通りCanInferType作品で説明したように、それを呼び出すのに対しerror CS0411: The type arguments for method 'Test.ExecuteCommand<T>(string, string, System.Func<System.Data.IDataRecord,T>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.を発するようにそれを呼び出すオプションのパラメータを持つジェネリック型を推論することができない

IEnumerable<T> ExecuteCommand<T>(
    string commandText, 
    string connectionName = null, 
    Func<IDataRecord, T> converter = null) { ... } 

static SomeClass Create(IDataRecord record) { return new SomeClass(); } 

void CannotInferType() { 
    var a = ExecuteCommand(
     "SELECT blah", 
     "connection", 
     converter: Test.Create); 
} 

void CanInferType() { 
    var a = ExecuteCommand(
     "SELECT blah", 
     "connection", 
     Test.Create); 
} 

上記のように、Visual Studio自体は問題はないと報告しています。変数aのインテリセンスは、期待どおりにIEnumerable<SomeClass>と表示されますが、何らかの理由でコンパイルされません。

+0

短くはありますが、完全な例を挙げると助かりました。 –

答えて

7

これはC#4コンパイラのバグでした。これはC#5コンパイラで修正されています。

ここで問題を引き起こしているのはオプションパラメータではないと思われます。名前付き引数です。あなたのパラメータのデフォルト値を削除しようとすると、私はあなたが同じ問題がまだあると思う。 (オプションパラメータと名前付き引数を区別する価値があります - それらは2つの別個の機能ですが、しばしば一緒に使用されますが必ずしもそうである必要はありません)。エリックとマッズへの報告:

using System; 

class Test 
{ 
    static void Foo<T>(Func<T> func) {} 

    static void Main() 
    { 
     // Works fine 
     Foo(() => "hello"); 

     // Type inference fails 
     Foo(func:() => "hello"); 
    } 
} 

幸い、この今がC#5ベータ版コンパイラでに動作します。

関連する問題