【发布时间】:2017-06-29 01:42:16
【问题描述】:
即使浏览了堆栈溢出以找到类似的答案,我也很难理解我遇到问题背后的概念。
我的代码如下:
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);
}
}
}
我收到以下错误:
类型“IndexerTest.ApprenticePage”不能用作类型参数 泛型类型或方法“Helper.Load(T)”中的“T”。没有 从 'IndexerTest.ApprenticePage' 到的隐式引用转换 'IndexerTest.BasePage
'.
在我看来,ApprenticePage 继承自 HomePage,而 HomePage 继承自 BasePage<T>,因此使用 load 方法可以,但显然不是。
我将如何修复我的 Load 方法,以便可以在我的代码中的所有类实例上调用该类的特定实现 EvaluateLoad()?
【问题讨论】:
-
根据扩展方法
where T : BasePage<T>的约束,当T为ApprenticePage时,ApprenticePage不是BasePage<ApprenticePage>因此报错
标签: c# generics constraints extension-methods