2017-07-28 17 views
3

(Func<IInterface>)(Func<Task<IInterface>>)のあいまいな呼び出しエラーが次のコードサンプルで発生するのはなぜですか?そして、メソッドグループコールを置き換えることなくこのエラーを回避するにはどうすればよいですか?より効率的な `か(実際にはわずか;`メソッド((機能 )のGetObject): (Func <IInterface>)と(Func <タスク<IInterface>>)のあいまいな呼び出し

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     Method(GetObject); 
    } 

    public static IInterface GetObject() => null; 

    public static void Method(Func<IInterface> func) => 
     Console.WriteLine("First"); 

    public static void Method(Func<Task<IInterface>> funcAsync) => 
     Console.WriteLine("Second"); 
} 

public interface IInterface { } 
+3

"修正" することを期待します'Method(()=> GetObject());' –

+2

'GetObject'は、この呼び出しのメソッドグループであり、C#の中に一見存在する神秘的な生き物です。代理人に過負荷解決を引き出す](https://stackoverflow.com/questions/2057146/)。 (具体的には、「オーバーロードの解決では戻り値の型は考慮されません」) –

+0

「メソッドグループ呼び出しを置き換えずに」質問を修正したので、答えは本当に単純な「できません」です。残された唯一のオプションは 'Method's(' MethodAsync'には素晴らしいリングがあります)の名前を変更して、最初に過負荷に遭遇しないようにすることです。 (私は、RoslynリポジトリでC#言語を変更することをお勧めしますが、成功のチャンスはそれほどありません)。オーバーロード解決は、メソッドグループを使用するときに、これらの2つのメソッドを区別できません。 –

答えて

1

これはあなたの方法として、問題を修正するには、メソッドはIInterfaceを返す関数が

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     Method(() => GetObject()); 
    } 

    public static IInterface GetObject() => null; 

    public static void Method(Func<IInterface> func) => 
     Console.WriteLine("First"); 

    public static void Method(Func<Task<IInterface>> funcAsync) => 
     Console.WriteLine("Second"); 
} 

public interface IInterface { } 
関連する問題