目次

Ver. 7.3
リリース時期 2018/未定
同世代技術
  • Visual Studio 2017 15.7
  • .NET Core 2.1
要約・目玉機能
  • C# 7.0~7.2のちょっとした改善

C# 7.0 以降の「小数点リリース」も3つ目となりました。 これまでのC# 7系リリースで追加されてきた、 タプル構造体と参照の活用式中での変数宣言になどに関する改善が含まれています。

※ C# 7.3 は現在プレビュー版です。正式リリースまでに機能に変更がある可能性があります。

タプルの ==, != 比較

https://github.com/ufcpp/UfcppSample/issues/185

参照ローカル変数の再割り当て

https://github.com/ufcpp/UfcppSample/issues/187

式中での変数宣言(使える場所の拡充)

https://github.com/ufcpp/UfcppSample/issues/190

ジェネリック型引数に対する Enum、Delegate、unmanaged 制約

https://github.com/ufcpp/UfcppSample/issues/184

オーバーロード解決の改善

オーバーロード解決が少し賢くなって、 これまでは呼び分けできなかったようなオーバーロードを呼び分けれるようになりました。

以下のようなものがあります。

  • 静的メソッドかインスタンス メソッドかの違いで解決できるようになった
  • ジェネリック型制約の違いで解決できるようになった
  •   メソッド グループを引数にするとき、メソッドの戻り値を見るようになった

例えば、型制約だと、以下のような拡張メソッドの呼び分けができるようになりました。

using System.Collections.Generic;
using System.Linq;

static class ClassExtensions
{
    // クラスの場合は LINQ の FirstOrDefault そのまま。
    public static T FirstOrNull<T>(this IEnumerable<T> source)
        where T : class
        => source.FirstOrDefault();
}

static class StructExtensions
{
    // 構造体の場合は null 許容型に変える必要がある。
    public static T? FirstOrNull<T>(this IEnumerable<T> source)
        where T : struct
        => source.Select(x => (T?)x).FirstOrDefault();
}

class Program
{
    static void Main()
    {
        // ClassExtensions の方のが呼ばれる。
        new[] { "a", "b", "c" }.FirstOrNull();

        // StructExtensions の方のが呼ばれる。
        new[] { 1, 2, 3 }.FirstOrNull();
    }
}

詳しくは「[雑記]オーバーロード解決」で説明します。

stackalloc 初期化子

https://github.com/ufcpp/UfcppSample/issues/188

ユーザー定義型の fixed ステートメント利用

所定のパターンを満たす型に対して fixed ステートメントが使えるようになりました。 以下のように、GetPinnableReferenceという名前のメソッドを用意すれば使えます。

readonly struct Array<T>
{
    private readonly T[] _array;
    public Array(int length) => _array = new T[length];
    public ref T this[int index] => ref _array[index];
    public int Length => _array.Length;

    // このメソッドがあれば fixed ステートメントを使えるようになる
    public ref T GetPinnableReference() => ref _array[0];
}

class Program
{
    static void Main(string[] args)
    {
        var a = new Array<int>(5);

        unsafe
        {
            // fixed (int* p = &a.GetPinnableReference()) に展開される。
            fixed (int* p = a)
            {
                for (int i = 0; i < 5; i++)
                    p[i] = i;
            }
        }

        for (int i = 0; i < 5; i++)
            System.Console.WriteLine(a[i]);
    }
}

詳しくは「ユーザー定義型の fixed ステートメント利用」で説明します。

その他

ほぼ「バグ修正」レベルの改善2点:

更新履歴

ブログ