gpt4 book ai didi

c# 泛型重载方法分派(dispatch)不明确

转载 作者:太空狗 更新时间:2023-10-29 20:32:21 25 4
gpt4 key购买 nike

我刚刚遇到了一个方法分派(dispatch)不明确的情况,想知道是否有人可以解释编译器 (.NET 4.0.30319) 在什么基础上选择要调用的重载

interface IfaceA
{

}

interface IfaceB<T>
{
void Add(IfaceA a);
T Add(T t);
}

class ConcreteA : IfaceA
{

}

class abstract BaseClassB<T> : IfaceB<T>
{
public virtual T Add(T t) { ... }
public virtual void Add(IfaceA a) { ... }
}

class ConcreteB : BaseClassB<IfaceA>
{
// does not override one of the relevant methods
}

void code()
{
var concreteB = new ConcreteB();

// it will call void Add(IfaceA a)
concreteB.Add(new ConcreteA());
}

无论如何,为什么编译器不警告我甚至为什么编译?非常感谢您的回答。

最佳答案

它遵循 C# 4 specification 的第 7.5.3.2 节中的规则(“更好的功能成员”)。

首先(好吧,在看到这两种方法都适用之后)我们需要检查从参数类型到参数类型的转换。在这种情况下,它相当简单,因为只有一个参数。参数类型到参数类型的转换都不是“更好”,因为两者都是从 ConcreteA 转换为 IfaceA。因此,它转向下一组标准,包括:

Otherwise, if MP has more specific parameter types than MQ, then MP is better than MQ. Let {R1, R2, …, RN} and {S1, S2, …, SN} represent the uninstantiated and unexpanded parameter types of MP and MQ. MP’s parameter types are more specific than MQ’s if, for each parameter, RX is not less specific than SX, and, for at least one parameter, RX is more specific than SX:specific than SX:

  • A type parameter is less specific than a non-type parameter.
  • ...

因此即使转换同样好,直接使用IfaceA(而不是通过委托(delegate))的重载被认为“更好”,因为类型的参数IfaceAT 类型的参数更具体。

没有办法让编译器对这种行为发出警告——这只是正常的重载解析。

关于c# 泛型重载方法分派(dispatch)不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2855138/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com