rksoftware

Visual Studio とか C# とかが好きです

C# 2.0 以降の新機能の確認 - C# 7.3 - オーバーロードの解決のあいまいなケースが削減されました

C# 2.0 以降の新機能を一つづつ確認していきます。
以前に一度行ったのですが、公式ドキュメント再編でリンク切れしているところを見つけてしまったので。今ならもっと簡潔なサンプルが欠けるところもあるだろうし、せっかくなので今もう一度確認して行きます。

オーバーロードの解決のあいまいなケースが削減されました

 [ 良いリンクを見つけられませんでした ]
 同名のインスタンス メソッドと静的メソッドとの解決/同名の型パタメーターの制約違いのメソッドの解決/引数のデリゲートの戻りの型違いのメソッドの解決が改善した。

class A
{
    static void MethodA(int i) {; }
    void MethodA(long l) {; }

    void MethodB<T>(T t, int i = 0) where T : class {; }
    void MethodB<T>(T t, long l = 0) where T : struct {; }

    void MethodC(Func<int> a) {; }
    void MethodC(Func<long> a) {; }
    int MethodD() => 1;
    long MethodE() => 1L;

    void Main()
    {
        // **インスタンス メンバーと静的メンバー**
        // C# のバージョンを低く設定すると
        // エラー CS0176  インスタンス参照でメンバー 'A.Method(int)' にアクセスできません。代わりに型名を使用してください
        // 希望としてはインスタンスメンバーの 'Method(long)' になってほしい
        this.MethodA((short)1);

        // **型引数が制約を満たしていない複数のジェネリック メソッド**
        // C# のバージョンを低く設定すると
        // エラー CS0121  次のメソッドまたはプロパティ間で呼び出しが不適切です: 'A.MethodB<T>(T, int)' と 'A.MethodB<T>(T, long)'
        // 希望としては 'MethodB<T>(T t, long l = 0) where T : struct' になってほしい
        MethodB(1);

        // **戻り値の型がデリゲートの戻り値の型と一致しない**
        // C# のバージョンを低く設定すると
        // エラー CS0121  次のメソッドまたはプロパティ間で呼び出しが不適切です: 'A.MethodC(Func<int>)' と 'A.MethodC(Func<long>)'
        // 希望としては 'A.MethodC(Func<long>)' になってほしい
        MethodC(MethodE);
    }
}