问题标签 [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.
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 材料,最好将此问题/讨论移到其他地方。
c# - C# 中的重载分辨率
在特定情况下,我遇到了 C# 中的重载解析问题。在我的 Razor 文件中,我有以下内容:
班级结构:
实际传递的实例是 Photo。
SearchResult(IEntity)
在应该调用的每个实例SearchResult(IPhoto)
(或 IEntity 派生的任何实例的最具体的重载)中调用。我怎样才能做我想做的事而不必诉诸于此?
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# 行为。
c++ - 禁止自动类型推断
我有以下演示代码:
这是我真实代码的简化版本,所以它似乎没用,但应该足以说明问题:
所以很明显,自动类型推断(对于模板参数 U)干扰了我选择正确版本的模板函数(只有 2 个参数)的兴趣
我需要两个版本都有一个基本的和一个专门的模板,做的事情有点不同。
所以问题是:有没有可能告诉编译器此时不要自动推断类型(例如通过某种方式说:采用只有 2 个参数的模板)?
c# - 使用 Func 委托重载的 Visual Studio 错误解决方法中的 lambda?
在具有各种 Func 委托重载的函数中使用匿名方法时,我在 Visual Studio 2010 中遇到了一些奇怪的行为。
我在下面创建了一个小型复制类。
考虑这个 ListViewAdapter 类
以下代码使用带有 lambda 的重载:
它应该解析为Func<RefType1, string, string>
并且第一个参数应该是RefType1
,但问题是它不是item
Visual RefType1
Studio 而是将其视为int
.
问题:Func 委托之间是否存在不明显的有效转换,或者这是 Visual Studio IntelliSense 错误?
c# - 当两个方法在替换类型参数后具有相同的签名时,将覆盖错误的重载
我们相信这个例子展示了 C# 编译器中的一个错误(如果我们错了,请取笑我)。这个错误可能是众所周知的:毕竟,我们的示例是对这篇博文中描述的内容的简单修改。
这个想法只是创建一个具有两个虚拟方法的类,其签名将在“邪恶”选择andBase<T, S>
后变得相同。该类只重载了其中一种虚方法,而且由于 的存在,应该明确定义哪一种!T
S
Conflict
Intermediate<,>
但是当程序运行时,输出似乎表明错误的重载被覆盖了。
当我们阅读 Sam Ng 的后续帖子时,我们得到了该错误未修复的表达,因为他们认为总是会抛出类型加载异常。但在我们的示例中,代码编译并运行没有错误(只是意外输出)。
2020 年的新增内容:这已在更高版本的 C# 编译器(Roslyn?)中得到纠正。当我问这个问题时,输出是:
截至 2020 年,tio.run
给出以下输出:
c# - c#重载解析规则
假设以下扩展方法:
现在我通过 IEnumerable<T> 接口的实现来调用它,比如说
在这种情况下调用哪一个,为什么?
c++ - 如果函数具有相同的名称,如何调用构造函数
如果我有以下情况:
我对它没有任何问题,因为我可以重命名它,但只是好奇如何强制它调用构造函数,而且我问自己为什么函数调用似乎比构造函数具有更高的优先级。此外,为什么没有关于重复名称的警告消息。
c++ - std::ostringstream 运算符重载搜索顺序?
我有以下课程:
当我这样做时:
第一个"Hello "
字符串被视为void*
. 如果我调试代码,则作为指针值而不是字符串"Hello "
传入并打印。std::basic_ostream::operator<< (void const*)
第二个字符串"World"
被正确地传递到全局重载 << 运算符中,该运算符采用char const*
.
我希望 << 运算符的两种用法都能解决相同的重载,但这不会发生。有人可以解释一下,也许可以提出解决办法吗?
提前致谢。
更新
我没有提到我坚持使用 C++03,但我很高兴有些人同时涵盖了 C++03 和 C++11 的情况。
c++ - Ambiguous string::operator= 调用隐式转换为 int 和 string 的类型
给定以下程序:
它可以在 Visual Studio 11 上编译,但不能在 clang 或 gcc 上编译。它遇到了麻烦,因为它想隐式地从 a 转换为 a GenericType
,int
但char
它也可以返回 a string
,因此存在歧义(operator=(char)
并且operator=(string)
两者都匹配GenericType
)。
但是,复制构造函数很好。
我的问题是:如何在不修改 main 内容的情况下解决这种歧义?我需要做些什么来修改GenericType
以处理这种情况?