ufcpp / UfcppSample

http://ufcpp.net/ 向けのサンプル
Apache License 2.0
133 stars 41 forks source link

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

Closed Tan90909090 closed 1 year ago

Tan90909090 commented 1 year ago

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

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](https://sharplab.io/#v2:C4LgTgrgdgNAJiA1AHwAICYCMBYAUHqAUwHcACAYQAoBKAOgFlMaBuPUvDUgQTwG83Sg1AGZSANwCWYYBACGAG1KoALKXo1SAXgB8SzAE5KAIi4Mj1VrgC+bDulIAhUiG58BQ0QHsxhMGAlwhEqq6tRauqgGxg5mFng2uOy4nOTOjm6JgqQA9NmkgFNygH4MgOYMxYBCDIAxDIAODICADICj+oBaDIAwDIBXgYBgSoDWDICL8YAiDICdpoB2DGqAsAyAMgyAPipVFYDRDIBADO45eYDKDAOALBqAECqA9gyODPOZHqTevv6BwWoaOqQARrIAzoQMLLb7i6QrgB9mgLIMfYBWDICRDIA3X0Af9odbgMUgTKZzBYiM6MC66G73ShcOihSxJLKvD7ff7A0ExegQyYzPZY2EqNToBHXO6ESgONFPaxAA))。
ufcpp commented 1 year ago

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

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

ufcpp commented 1 year ago

C# 9.0 (予定)以降であれば、この書き方はクラスに対しても使えます ↓ 将来的にはこの書き方も認めたいという計画はあります

ufcpp commented 1 year ago

継承のページ側、

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

ufcpp commented 1 year ago

修正。