2017-06-29 6 views
0

同様の応答でスタックオーバーフローが検出されても、私はなぜ問題が発生しているのかを理解するのに苦労しています。一般的な拡張メソッドを使用しようとしたときに暗黙の参照変換が行われない

私のコードは以下の通りです:

class Program { 
    static void Main(string[] args) { 
     HomePage page = new HomePage(); 
     page.Load(); //No Error 
     LoginPage page2 = new LoginPage(); 
     page2.Load(); //No Error 
     ApprenticePage page3 = new ApprenticePage(); 
     page3.Load(); //No implicit reference conversion 
     ApprenticeEPA page4 = new ApprenticeEPA(); 
     page4.Load(); //No implicit reference conversion 
     Console.ReadLine(); 
    } 
} 

public abstract class BasePage<T> where T : BasePage<T> { 
    public abstract bool EvaluateLoad(); 
} 

public class HomePage : BasePage<HomePage> 
{ 
    public override bool EvaluateLoad() 
    { 
     Console.WriteLine("In HomePage"); 
     return true; 
    } 
} 

public class LoginPage : BasePage<LoginPage> 
{ 
    public override bool EvaluateLoad() 
    { 
     Console.WriteLine("In LoginPage"); 
     return true; 
    } 
} 

public class ApprenticePage : HomePage 
{ 
    public override bool EvaluateLoad() 
    { 
     Console.WriteLine("In ApprenticePage"); 
     return false; 
    } 
} 

public class ApprenticeEPA : ApprenticePage 
{ 
    public override bool EvaluateLoad() 
    { 
     Console.WriteLine("In ApprenticeEPA"); 
     return false; 
    } 
} 

public static class Helper { 
    public static T Load<T>(this T page) where T : BasePage<T> { 
     if (page.EvaluateLoad()) { 
      Console.WriteLine("It's true!"); 
      return page; 
     } else { 
      Console.WriteLine("It's false!"); 
      return default(T); 
     }   
    } 
} 

私は次のエラー取得しています:BasePage<T>から継承HomePageからApprenticePage継承、として、私の心の中で

The type 'IndexerTest.ApprenticePage' cannot be used as type parameter 'T' in the generic type or method 'Helper.Load(T)'. There is no implicit reference conversion from 'IndexerTest.ApprenticePage' to 'IndexerTest.BasePage<IndexerTest.ApprenticePage>'.

を、ロードメソッドを使用すると大丈夫ですが、明らかにそうではありません。

Loadメソッドを修正して、クラス固有の実装がEvaluateLoad()のコード内のすべてのクラスインスタンスで呼び出せるようにするにはどうすればよいですか?

+1

制約によると、拡張メソッド 'T上:Tは' ApprenticePage'、 'ApprenticePage'は' BasePageクラス 'それゆえではないですBasePageクラス'、エラー – Nkosi

答えて

2

あなたが密接にエラーを調べる場合は、次の言葉:

There is no implicit reference conversion from 'ApprenticePage' to 'BasePage<ApprenticePage>'

これは正しいです。 ApprenticePageBasePage<HomePage>で、それはあなたが何をしようとしてBasePage<ApprenticePage>

ないのはBaseType<T>を実装して何に取り組んで拡張メソッドを作成することです。だから、あなたの拡張メソッドは次のようになります。

public static BasePage<T> Load<T>(this BasePage<T> page) where T : BasePage<T> 
{ 
    if (page.EvaluateLoad()) 
    { 
     Console.WriteLine("It's true!"); 
     return page; 
    } 
    else 
    { 
     Console.WriteLine("It's false!"); 
     return null; // No need for default() here - default() of a reference type is 
        // always going to be null 
    } 
} 
+0

ありがとうございます。 'LoginPage'のメソッドを' LoginClick'と呼び、 'ApprenticeEPA'ページの' EPAClick'というメソッドを持っていた場合は、Load 拡張メソッドを作成して、 'loginPage.Load() ).LoginClick() 'と' apprenticeEPAPage.Load()。EPAClick() '?制約が「BasePage 」と「BasePage 」の両方に必要であるため、これが可能であるかどうかはわかりません。ありがとう – Konzy262

+0

@ Konzy262その場合は 'Load(this LoginPage page) 'としてください。 – Rob

+0

ありがとう@Rob。トリックをやった – Konzy262

関連する問題