ufcpp/UfcppSample

base(T)関連の表記がC# 8時代の表現にとどまっている

Closed this issue · 4 comments

インターフェースページの多重継承箇所に以下のコードや説明があります:

class C : IB, IC
{
    // これなら IB.M を明示的に呼べる。
    public void M() => base(IB).M();
}

※ 元々 C# 8.0 に入る予定で一時的には実装されていましたが、 最終的には 8.0 から外れて、9.0 で取り組みなおすことになりました。
ちなみに、C# 9.0 (予定)以降であれば、この書き方はクラスに対しても使えます (参考: 「base(T) アクセス」)。

しかし、C#11の現状でも上記の書き方はまだエラーになります(SharpLab)。

同様に、継承ページのbase(T) アクセス箇所に以下のコードや説明があります:

これに対して、C# 9.0 (予定)では、base(T) という形で、特定のクラスを明示的に指定できるようになりました。

using System;
 
class A
{
    public virtual void M() => Console.WriteLine("A.M");
}
 
class B : A
{
    public override void M() => Console.WriteLine("B.M");
}
 
class C : B
{
    // 今までであれば、必ず「自分に近い方の M」が呼ばれる。
    // この場合は B.M。
    public override void M() => base.M();
 
    // この書き方なら絶対に A.M が呼ばれる。
    public void M1() => base(A).M();
 
    // この書き方なら絶対に B.M が呼ばれる。
    public void M2() => base(B).M();
}

この挙動の差を埋めようと思うと .NET ランタイム自体にそこそこ大変な修正が必要で、 C# 9.0/.NET 5 で改めて取り組むことになりました。

同様に、C#11の現状でも上記の書き方はまだエラーになります(SharpLab)。

ufcpp commented

Backlog (さしあたってアクティブに検討してる人0)くらいのレベルまで落ちてた気がする(要確認)。

余裕を見て「移行で」とかなんとか足しておきます。

ufcpp commented

C# 9.0 (予定)以降であれば、この書き方はクラスに対しても使えます

将来的にはこの書き方も認めたいという計画はあります

ufcpp commented

継承のページ側、

C# 9.0 で → C# 9.0 移行で
C# 9.0 (予定)では → 将来的には
C# 9.0/.NET 5 で改めて取り組むことになりました。 → (その後結局あまり進んでいなくて、.NET 7 / C# 11 の時点でも未実装です。)

ufcpp commented

修正。