下記コード内に注釈で記した振る舞いに困っています.
- なぜこうなるのでしょうか?
- どう修正すれば良いのでしょうか?(=どうすれば期待している動作を達成できるのでしょうか?)
(追記: .NET Framework 4.8 を使用しています)
C#
1// 2//問題が再現するコード 3// 4 5public interface ICopyable<T> 6 where T : class 7{ void Copy( T Src ); } 8 9public abstract class Base : ICopyable<Base> 10{ 11 public int BaseData{ get; set; } 12 13 public void Copy( Base Src ){ BaseData = Src.BaseData; } 14 15 public int VeryImportantWork() 16 { 17 //... 18 //... 19 return VeryImportantDecision(); 20 } 21 22 protected abstract int VeryImportantDecision(); 23} 24 25public class Deriv : Base, ICopyable<Deriv> 26{ 27 public int DerivData{ get; set; } 28 29 public Deriv() : this( 0,0 ) { } 30 public Deriv( int b, int d ){ BaseData = b; DerivData = d; } 31 32 public void Copy( Deriv Src ) 33 { 34 DerivData = Src.DerivData; 35 base.Copy( Src ); 36 } 37 38 protected override int VeryImportantDecision() 39 { return BaseData + DerivData; } 40} 41 42public class Test<T> 43 where T : Base, ICopyable<T>, new() 44{ 45 public int DoSomething( T Src ) 46 { 47 var XXX = new T(); 48 49 //※1 : 50 //T の型が Deriv であるとき, Deriv.Copy(Deriv) が呼ばれて欲しいわけだが 51 //コレが Base.Copy(Base) になってしまう. 52 //( where句の ICopyable<Deriv> よりも Base が優先されている??) 53 XXX.Copy( Src ); 54 55 //... 56 return XXX.VeryImportantWork(); 57 } 58} 59 60class Program 61{ 62 static void Main(string[] args) 63 { 64 var t = new Test<Deriv>(); 65 66 //※2 : 67 //結果として 120 が返されることを期待しているが,(上記※1によって) 20 が返される 68 int Result = t.DoSomething( new Deriv(20,100) ); 69 Console.WriteLine( Result.ToString() ); 70 Console.Read(); 71 } 72}

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2025/06/27 08:14
2025/06/27 08:48
2025/06/27 09:09
2025/06/27 09:23
2025/06/27 10:24
2025/06/27 10:57
2025/06/27 11:14
2025/06/27 11:40