问题标签 [overload-resolution]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1295 浏览

c# - 为什么类型约束不是方法签名的一部分?

更新:从 C# 7.3 开始,这应该不再是问题。从发行说明:

当方法组包含一些类型参数不满足其约束的泛型方法时,这些成员将从候选集中删除。

C# 7.3 之前的版本:

所以我读了Eric Lippert 的 'Constraints are not part of the signature',现在我明白规范指定在重载决议之后检查类型约束,但我仍然不清楚为什么必须如此。下面是埃里克的例子:

这不会编译,因为重载解析:Foo(new Giraffe())推断这Foo<Giraffe>是最佳重载匹配,但类型约束失败并引发编译时错误。用埃里克的话来说:

这里的原则是重载解析(和方法类型推断)在参数列表和每个候选方法的形式参数列表之间找到最佳匹配。也就是说,他们查看候选方法的签名。

类型约束不是签名的一部分,但为什么不能呢?在哪些情况下考虑将类型约束作为签名的一部分是一个坏主意?实施起来很难还是不可能?我并不是在主张,如果由于某种原因无法调用最佳选择的重载,那么就默默地回退到次优;我会讨厌那个。我只是想了解为什么不能使用类型约束来影响最佳重载的选择。

我在 C# 编译器内部想象,仅用于重载解析目的(它不会永久重写方法),如下:

转换为:

为什么不能将类型约束“拉入”到形式参数列表中?这如何以任何不好的方式改变签名?我觉得它只会加强签名。然后Foo<Reptile>永远不会被视为过载候选者。

编辑2:难怪我的问题如此混乱。我没有正确阅读 Eric 的博客,并且引用了错误的示例。我在我认为更合适的示例中进行了编辑。我还将标题更改为更具体。这个问题似乎不像我最初想象的那么简单,也许我错过了一些重要的概念。我不太确定这是 stackoverflow 材料,最好将此问题/讨论移到其他地方。

0 投票
3 回答
628 浏览

c# - C# 中的重载分辨率

在特定情况下,我遇到了 C# 中的重载解析问题。在我的 Razor 文件中,我有以下内容:

班级结构:

实际传递的实例是 Photo。

SearchResult(IEntity)在应该调用的每个实例SearchResult(IPhoto)(或 IEntity 派生的任何实例的最具体的重载)中调用。我怎样才能做我想做的事而不必诉诸于此?

0 投票
3 回答
427 浏览

c# - C# 中的方法重载解析和泛型/逆变接口

我认为我的问题最好用我的类/接口层次结构的代码片段来解释:

问题1:为什么在第二种情况下s1.Transform(v)resolve toITransform<ISelection>而不是to ?ITransform<IValue>

问题 2:ITransform对于问题 1,如果is<D>或似乎没有区别<in D><in D>但是您是否看到在我的类/界面层次结构中使用的任何其他问题?我有点怀疑,因为ISelector哪个实现ITransform<IValue>ITransform<ISelection>. IValue由于继承,逆变可能会在这里引起任何问题ISelection吗?

编辑 只是为了让您知道:我目前正在使用 Silverlight 4,但我认为这是一般的 C# 行为。

0 投票
2 回答
211 浏览

c++ - 禁止自动类型推断

我有以下演示代码:

这是我真实代码的简化版本,所以它似乎没用,但应该足以说明问题:

所以很明显,自动类型推断(对于模板参数 U)干扰了我选择正确版本的模板函数(只有 2 个参数)的兴趣

我需要两个版本都有一个基本的和一个专门的模板,做的事情有点不同。

所以问题是:有没有可能告诉编译器此时不要自动推断类型(例如通过某种方式说:采用只有 2 个参数的模板)?

0 投票
3 回答
491 浏览

c# - 使用 Func 委托重载的 Visual Studio 错误解决方法中的 lambda?

在具有各种 Func 委托重载的函数中使用匿名方法时,我在 Visual Studio 2010 中遇到了一些奇怪的行为。

我在下面创建了一个小型复制类。

考虑这个 ListViewAdapter 类

以下代码使用带有 lambda 的重载:

它应该解析为Func<RefType1, string, string>并且第一个参数应该是RefType1,但问题是它不是itemVisual RefType1Studio 而是将其视为int.

问题:Func 委托之间是否存在不明显的有效转换,或者这是 Visual Studio IntelliSense 错误?

0 投票
1 回答
734 浏览

c# - 当两个方法在替换类型参数后具有相同的签名时,将覆盖错误的重载

我们相信这个例子展示了 C# 编译器中的一个错误(如果我们错了,请取笑我)。这个错误可能是众所周知的:毕竟,我们的示例是对这篇博文中描述的内容的简单修改。

这个想法只是创建一个具有两个虚拟方法的类,其签名将在“邪恶”选择andBase<T, S>后变得相同。该类只重载了其中一种虚方法,而且由于 的​​存在,应该明确定义哪一种!TSConflictIntermediate<,>

但是当程序运行时,输出似乎表明错误的重载被覆盖了。

当我们阅读 Sam Ng 的后续帖子时,我们得到了该错误未修复的表达,因为他们认为总是会抛出类型加载异常。但在我们的示例中,代码编译并运行没有错误(只是意外输出)。


2020 年的新增内容:这已在更高版本的 C# 编译器(Roslyn?)中得到纠正。当我问这个问题时,输出是:

截至 2020 年,tio.run给出以下输出

0 投票
2 回答
186 浏览

c# - c#重载解析规则

假设以下扩展方法:

现在我通过 IEnumerable<T> 接口的实现来调用它,比如说

在这种情况下调用哪一个,为什么?

0 投票
2 回答
160 浏览

c++ - 如果函数具有相同的名称,如何调用构造函数

如果我有以下情况:

我对它没有任何问题,因为我可以重命名它,但只是好奇如何强制它调用构造函数,而且我问自己为什么函数调用似乎比构造函数具有更高的优先级。此外,为什么没有关于重复名称的警告消息。

0 投票
2 回答
296 浏览

c++ - std::ostringstream 运算符重载搜索顺序?

我有以下课程:

当我这样做时:

第一个"Hello "字符串被视为void*. 如果我调试代码,则作为指针值而不是字符串"Hello "传入并打印。std::basic_ostream::operator<< (void const*)第二个字符串"World"被正确地传递到全局重载 << 运算符中,该运算符采用char const*.

我希望 << 运算符的两种用法都能解决相同的重载,但这不会发生。有人可以解释一下,也许可以提出解决办法吗?

提前致谢。

更新

我没有提到我坚持使用 C++03,但我很高兴有些人同时涵盖了 C++03 和 C++11 的情况。

0 投票
4 回答
2678 浏览

c++ - Ambiguous string::operator= 调用隐式转换为 int 和 string 的类型

给定以下程序:

它可以在 Visual Studio 11 上编译,但不能在 clang 或 gcc 上编译。它遇到了麻烦,因为它想隐式地从 a 转换为 a GenericTypeintchar它也可以返回 a string,因此存在歧义(operator=(char)并且operator=(string)两者都匹配GenericType)。

但是,复制构造函数很好。

我的问题是:如何在不修改 main 内容的情况下解决这种歧义?我需要做些什么来修改GenericType以处理这种情况?