尝试使用通用扩展方法时没有隐式引用转换
No implicit reference conversion when attempting to use generic extension method
即使浏览了 stack overflow 以获得类似的答案,我仍在努力理解我遇到问题的原因背后的概念。
我的代码如下:
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);
}
}
}
我收到以下错误:
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>'.
在我看来,由于ApprenticePage
继承自HomePage
,而HomePage
继承自BasePage<T>
,所以使用load方法是可以的,但显然不行。
我将如何修复我的 Load
方法,以便它可以在我的代码中的 类 的所有实例上使用 EvaluateLoad()
的 类 特定实现调用?
如果您仔细检查错误,它会显示以下内容:
There is no implicit reference conversion from 'ApprenticePage' to 'BasePage<ApprenticePage>'
这是正确的; ApprenticePage
是 BasePage<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
}
}
即使浏览了 stack overflow 以获得类似的答案,我仍在努力理解我遇到问题的原因背后的概念。
我的代码如下:
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);
}
}
}
我收到以下错误:
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>'.
在我看来,由于ApprenticePage
继承自HomePage
,而HomePage
继承自BasePage<T>
,所以使用load方法是可以的,但显然不行。
我将如何修复我的 Load
方法,以便它可以在我的代码中的 类 的所有实例上使用 EvaluateLoad()
的 类 特定实现调用?
如果您仔细检查错误,它会显示以下内容:
There is no implicit reference conversion from 'ApprenticePage' to 'BasePage<ApprenticePage>'
这是正确的; ApprenticePage
是 BasePage<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
}
}