43351


オーバーロードが存在するメソッド `Second()` を、ジェネリックメソッド `First()` から呼び出しています。  
`First()` に `int` を渡したときは `Second(int)` が呼ばれてほしいのですが、`Second(object)`
が呼び出されてしまいます。  
何か良い方法はないでしょうか？

[code]

    [TestMethod]
    public void TestMethod1()
    {
        Console.WriteLine(this.First("string")); // "object"
        Console.WriteLine(this.First(1)); // "object" ("int" が返ってきてほしい)
    }
    
    private string First<T>(T args)
    {
        return this.Second(args);
    }
    
    private string Second(object args)
    {
        return "object";
    }
    
    private string Second(int args)
    {
        return "int";
    }
    
[/code]


CC BY-SA 3.0
2018-04-18T05:52:01.667
43349
2018-04-18T06:46:54.220
28215
question
c#
ジェネリックが絡むオーバーロードの解決


C++のtemplateに慣れていると当然そうなってほしいのですが、C#のジェネリックでは実行時に判断するしかなさそうです。

[code]

    private string First<T>(T args)
    {
        if (args is int)
            return this.Second((int)(object)args);
        else
            return this.Second(args);
    }
    
[/code]

上記だと`Second()`のオーバーロードが増えるたびに`First()`を改修する必要があります。  
それが嫌なら`dynamic`にキャストすることで実行時にオーバーロード解決をすることができます。

[code]

    private string First<T>(T args)
    {
        return this.Second((dynamic)args);
    }
    
[/code]


CC BY-SA 3.0
2018-04-18T06:46:54.220
43351
2018-04-18T06:46:54.220
4765
43349
answer