【问题标题】:No implicit reference conversion when attempting to use generic extension method尝试使用泛型扩展方法时没有隐式引用转换
【发布时间】: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&lt;T&gt;,因此使用 load 方法可以,但显然不是。

我将如何修复我的 Load 方法,以便可以在我的代码中的所有类实例上调用该类的特定实现 EvaluateLoad()

【问题讨论】:

  • 根据扩展方法where T : BasePage&lt;T&gt; 的约束,当T为ApprenticePage时,ApprenticePage不是BasePage&lt;ApprenticePage&gt;因此报错

标签: c# generics constraints extension-methods


【解决方案1】:

如果您仔细检查错误,它会显示以下内容:

没有从“ApprenticePage”到“BasePage”的隐式引用转换

这是正确的; ApprenticePageBasePage&lt;HomePage&gt;,不是 BasePage&lt;ApprenticePage&gt;

您要做的是创建一个扩展方法,该方法适用于任何实现BaseType&lt;T&gt; 的东西。所以,你的扩展方法应该是这样的:

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
    }
}

【讨论】:

  • 谢谢。如果我在LoginPage 上有一个名为LoginClick 的方法,在ApprenticeEPA 页面上有一个名为EPAClick 的方法,是否可以创建一个允许我同时执行loginPage.Load().LoginClick() 的Load 扩展方法和apprenticeEPAPage.Load().EPAClick()?我不确定这是可能的,因为约束需要同时适用于BasePage&lt;HomePage&gt;BasePage&lt;LoginPage&gt;。谢谢
  • @Konzy262 在这种情况下,只需将其命名为Load(this LoginPage page)
猜你喜欢
  • 2017-04-13
  • 1970-01-01
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多