使用继承和重载时奇怪的C#编译器行为

时间:2019-06-12 09:49:47

标签: c# .net .net-core

昨天,我在处理继承和重载解析时看到了奇怪的C#编译器行为。今天,我尝试在新项目中重现它,而且我能够做到。您可以使用this repository查看完整的实验项目。但是,基本上我有两节课。 ExecuterBase如下:

public class ExecuterBase
{
    public virtual void Execute(Analytics analytics)
    {
        analytics?.Execute();
    }
}

继承Executer的{​​{1}}如下:

ExecuterBase

public class Executer : ExecuterBase { public void Experiment() { var analytics = new Analytics(); Execute(analytics); } public void Execute<TNonAnalytics>(TNonAnalytics nonAnalytics) where TNonAnalytics : INonAnalytics { nonAnalytics?.Execute(); } public override void Execute(Analytics analytics) { // some additional staff goes here base.Execute(analytics); } } Analytics几乎是空的,仅用于演示:

INonAnalytics

public class Analytics { public void Execute() { } } public interface INonAnalytics { void Execute(); } 未实现Analytics。 问题是,我在INonAnalytics方法内的Execute(analytics);行出现编译器错误

  

不能使用类型“ Experiments.InheritanceAndOverload.Analytics”   作为泛型类型或方法中的类型参数“ TNonAnalytics”   'Executer.Execute(TNonAnalytics)'。没有隐含   来自的参考转换   'Experiments.InheritanceAndOverload.Analytics'   'Experiments.InheritanceAndOverload.INonAnalytics'

很显然,它尝试使用Experiment来使用应重写的方法。有趣的是,当您将所有方法放入同一类时,它可以编译确定。您可以在存储库中看到该类-SingleExecuter.cs

  1. 当我改用public void Execute<TNonAnalytics>(TNonAnalytics nonAnalytics)时它可以编译,但是我需要重写方法,所以它不是一个选择。
  2. 当我使用base.Execute(analytics);而不是Execute(INonAnalytics nonAnalytics)时,编译正常-但是在原始项目中,我有多个类型约束,而且我在此方法内使用通用类型参数,因此它也不选项。

即使有某种解决方法,我也要学习为什么编译器会如此操作的原因,而不是这种解决方法。可能有一些适用于此的C#语言规范,我想念它们。我怀疑这是一个编译器错误。

0 个答案:

没有答案