- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题
考虑这两个扩展方法,它们只是来自任何类型的简单映射 T1
至 T2
,加上一个重载来流畅地映射 Task<T>
:
public static class Ext {
public static T2 Map<T1, T2>(this T1 x, Func<T1, T2> f)
=> f(x);
public static async Task<T2> Map<T1, T2>(this Task<T1> x, Func<T1, T2> f)
=> (await x).Map(f);
}
var a = Task
.FromResult("foo")
.Map(x => $"hello {x}"); // ERROR
var b = Task
.FromResult(1)
.Map(x => x.ToString()); // ERROR
CS0121: The call is ambiguous between the following methods or properties: 'Ext.Map(T1, Func)' and 'Ext.Map(Task, Func)'
var c = Task
.FromResult(1)
.Map(x => x + 1); // works
var d = Task
.FromResult("foo")
.Map(x => x.Length); // works
var e = Task
.FromResult(1)
.Map(_ => 0); // ERROR
Task<T1>.Map<T1,T2>()
的类型参数明确地:
var f = Task
.FromResult("foo")
.Map<string, string>(x => $"hello {x}"); // works
var g = Task
.FromResult(1)
.Map<int, int>(_ => 0); // works
string foo(string x) => $"hello {x}";
var h = Task
.FromResult("foo")
.Map(foo); // works
Func<T, T>
):
public static class Ext2 {
public static T Map2<T>(this T x, Func<T, T> f)
=> f(x);
public static async Task<T> Map2<T>(this Task<T> x, Func<T, T> f)
=> (await x).Map2(f);
}
最佳答案
根据 C# 规范,Method invocations ,接下来的规则用于考虑泛型方法 F
作为方法调用的候选者:
Method has the same number of method type parameters as were supplied in the type argument list,
and
Once the type arguments are substituted for the corresponding method type parameters, all constructed types in the parameter list of
F
satisfy their constraints (Satisfying constraints), and the parameter list ofF
is applicable with respect toA
(Applicable function member).A
- optional argument list.
Task.FromResult("foo").Map(x => $"hello {x}");
public static T2 Map<T1, T2>(this T1 x, Func<T1, T2> f);
public static async Task<T2> Map<T1, T2>(this Task<T1> x, Func<T1, T2> f);
// T2 Map<T1, T2>(this T1 x, Func<T1, T2> f)
string Ext.Map<Task<string>, string>(Task<string>, Func<Task<string>, string>);
// Task<T2> Map<T1, T2>(this Task<T1> x, Func<T1, T2> f)
Task<string> Ext.Map<string, string>(Task<string>, Func<string, string>);
Map
方法没有类型约束)并且根据可选参数适用(因为
Map
方法也没有可选参数)。
注:使用类型推断来定义第二个参数(lambda 表达式)的类型。
The best method of the set of candidate methods is identified using the overload resolution rules of Overload resolution. If a single best method cannot be identified, the method invocation is ambiguous, and a binding time error occurs. When performing overload resolution, the parameters of a generic method are considered after substituting the type arguments (supplied or inferred) for the corresponding method type parameters.
// I intentionally wrote it as static method invocation.
Ext.Map(Task.FromResult("foo"), x => $"hello {x}");
Ext.Map<Task<string>, string>(Task.FromResult("foo"), (Task<string> x) => $"hello {x}");
Ext.Map<string, string>(Task.FromResult("foo"), (string x) => $"hello {x}");
Exp.Map<T1, T2>(Task<T1>, Func<T1, T2>)
作为考虑方法调用的更好方法。在这种情况下(当无法定义更好的方法时)会发生编译时错误。
// Call to: T2 Map<T1, T2>(this T1 x, Func<T1, T2> f);
var a = Task.FromResult("foo").Map( (string x) => $"hello {x}" );
// Call to: async Task<T2> Map<T1, T2>(this Task<T1> x, Func<T1, T2> f);
var b = Task.FromResult(1).Map( (Task<int> x) => x.ToString() );
T1
明确定义并且不会出现歧义。
关于c# - 如何解释这个 "call is ambiguous"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60754529/
为什么我的重载成员函数只是“不明确”为 char 而不是 int 和 string? 我试图通过重载的 equals() 函数汇集代码,为我的 Char 类创建一个单代码路径。当我使用 equals
我阅读了以下重要问题:Attributes in C#并学到了很多关于属性的知识。 我正在使用一个使用多个属性的库。示例: [State] public class USStates { [C
令我惊讶的是,以下代码在 VS2005 中编译时没有出现任何问题,因为在实现中对 Bar() 的调用让我停下来想知道如何消除歧义。 class Foo { public: void Bar(int
考虑以下几点: struct A { A(int, int) { } }; struct B { B(A ) { } // (1) expl
假设我们有这段代码,是从一个单独的问题中复制过来的: namespace x { void f() { } class C { void f()
考虑 C 代码 a = a = a。没有用于分配的序列点,因此此代码在编译时会产生有关 a 上未定义操作的警告。 a 在这里可能有哪些值? a 似乎无法更改值。这里实际上有未定义的行为还是编译器只是懒
题目地址:https://leetcode.com/problems/ambiguous-coordinates/description/ 题目描述: Wehad some 2-dimension
这个问题在这里已经有了答案: ORA-00918: column ambiguously defined in SELECT * (4 个答案) 关闭 5 年前。 所以我这学期很难理解 SQL。我真
我对 git 还很陌生。目前我尝试按照本教程使用分支名称和版本覆盖我的应用程序的图标:http://www.merowing.info/2013/03/overlaying-application-v
我已经升级到Xcode 11和Swift 5,并且在通过框架提供方法扩展时遇到了一个问题。更具体地说,在一个结构如下的项目中: -> Main Project -> Framework created
我有这样的片段: template bool apply_impl(data_t * d) const { return this->Last::apply(*
以下数据库结构: 表 cms_pages 包含带有 id、名称、标题等的页面 表 cms_pagerows 包含具有 cms_page_id 和排名的行 (cms_page_id 上的唯一索引,排名)
我正在尝试使用以下代码创建一个客户列表以及他们购买的品牌。 brands 表包含品牌名称,customer_id 在 customers 表中。要链接它们,我必须通过 receipts 表(连接到 c
我收到错误 “Integrity constraint violation: 1052 Column 'restaurant_id' in where clause is ambiguous' in”
我有一个在页面中间有一个表格 View 的布局。我希望根据用户设备的屏幕尺寸任意调整表格 View 的大小。在 ascii 中: +-----------+ |some stuff | +------
我正在尝试创建一个可以帮助您计算商品销售税的应用程序。当然应用程序需要乘法但我一直遇到错误: "Type of expression is ambiguous without more context
我正在尝试使用以下类型别名来定义它来传递一个函数: typealias AuthFunction = (String, String, AuthDataResultCallback?) -> ()
我对继承有疑问。假设我有 4 节课:基类A,B类继承A,C类继承A,BC 类继承 B 和 C class A { public: void test() {
我正在尝试整理一些代码。 我有 16 个类,它们都有一些共同的功能,我用宏抽象了这些功能: #define COMMON4( CLASS, BASE, ASSIGN, CHECK ) \ ex
在接下来的代码中,在 _tmain(..) 中调用 D::f 时出现不明确的错误因为 B::f 覆盖了 A::f,所以 A::vtable 中指向 f 的指针指向 B::f。 1) 为什么编译器会给出
我是一名优秀的程序员,十分优秀!