昨天,我在处理继承和重载解析时看到了奇怪的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。
public void Execute<TNonAnalytics>(TNonAnalytics nonAnalytics)
时它可以编译,但是我需要重写方法,所以它不是一个选择。base.Execute(analytics);
而不是Execute(INonAnalytics nonAnalytics)
时,编译正常-但是在原始项目中,我有多个类型约束,而且我在此方法内使用通用类型参数,因此它也不选项。即使有某种解决方法,我也要学习为什么编译器会如此操作的原因,而不是这种解决方法。可能有一些适用于此的C#语言规范,我想念它们。我怀疑这是一个编译器错误。