Tag: 重载决议

从一组重载中获得最佳匹配过载

假设我有一个课程如下: public class AcceptMethods { public int Accept(string s, int k = 1) { return 1; } public int Accept(object s) { return 2; } public int Accept(IEnumerable s) { return 7; } public int Accept(IList s) { return 4; } } 现在,如果我尝试在代码中使用它,我使用这样的东西: object[] list = new object[] { “a”, new object[0], “c”, “d” }; […]

使用Action 参数重载调用不明确的方法

在使用不同的Action变体调用重载方法时,我遇到了一些意外的编译器行为。 假设我有这个类Test ,我在CallTest构造函数中创建它的实例。 public class Test { public Test(Action arg) { } public Test(Action arg) { } } public class CallTest { public CallTest() { Test t = new Test(TestDecimal); } public void TestDecimal(decimal arg) { } public void TestLong(long arg) { } } 当使用TestDecimal或TestLong作为参数调用Test构造函数时,我收到以下错误: 以下方法或属性之间的调用不明确:’ Test(System.Action) ‘和’ Test(System.Action) ‘ 我的猜测是在long和decimal之间有一些隐式转换,但有没有人有任何其他想法我可能做错了什么? 有没有解决方法?

Lambda转换具有不明确的返回类型和重载决策

如果我有一个lambda,如() => { throw new Exception(); } () => { throw new Exception(); } ,目前还不清楚它是否有返回类型。 因此,它可以(隐式)转换为Action和Func (或任何其他Func )。 这是因为,根据§6.5C#4规范的匿名函数转换 : [A]委托类型D与提供的匿名函数F兼容: … 如果D具有void返回类型且F的主体是语句块,则当F的主体是有效语句块时,其中没有return语句指定表达式。 如果D具有非void返回类型且F的主体是语句块,则当F的主体是具有不可到达端点的有效语句块时,其中每个return语句指定隐式表达式可转换为D的返回类型。 但是如果我有一个方法的两个重载,其中一个具有Action类型的参数而另一个具有Func ,并且我从上面传递lambda,则使用Func重载。 为什么? 规范的哪一部分说在这种情况下Func比Action更好? 我已经看过§7.5.3.2 更好的函数成员 ,但这并没有解释它。