滅入るんるん

何か書きます

【C#】コンストラクタで参照渡しできた話と出力変数宣言できるようになる話

よく++C++; // 未確認飛行 Cにはお世話になっていますが、その中のC#7.3新機能説明(式中での変数宣言をできる箇所の拡大)について、お恥ずかしながらよくわからないC#コードがあり、新たな発見をしたので、その報告をします。

式中での変数宣言(使える場所の拡充)
問題のコードを抜粋すると以下のようなものです

using System;

class Derived : base
{
    public Derived(int a) : base(out var x)
    {
        // base の場合でも同様。
        Console.WriteLine(x);
    }
}

このコンストラクタでのbaseの箇所""out var x""はなんなのか、当初はちっとも検討が付きませんでしたが、同僚の指摘によってどのようになってるかわかりました。

まず、上記のコードは基底クラスが省かれてるので同じような記述をすると以下のようになります。

class Base
{
    // コンストラクタ
    public Base(out int a)
    {
        a = 10;
    }
}

class Sub : Base
{

    // コンストラクタ
    public Sub() : base(out int a)
    {
        Console.WriteLine(a); // 10
    }
}

ここでBaseクラスのコンストラクタではint型の参照渡し(正確には出力引数)になっています。
気づきポイント①:コンストラクタでも参照渡しできた

そして、C#7.3では式中での変数宣言のできる箇所が拡大されたため、Subクラスのコンストラクタのbaseでは出力変数宣言になっています。
気づきポイント②:コンストラクタで出力変数宣言ができるようになった

ちなみにですが、Baseクラスのコンストラクタでは参照渡しの引数なので型の明示が必要ですが、Subクラスのコンストラクタでは出力変数宣言なのでvarによる型推論も可能です。




C#歴6年目ぐらいになりましたが、まだまだ知らない機能があってC#は勉強してて楽しいです。