加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 为什么添加返回类型会阻止我使用方法组语法?

发布时间:2020-12-16 00:14:39 所属栏目:百科 来源:网络整理
导读:我正在尝试在lambda表达式中使用方法组,如下所示: public class Foo { public void Hello(string s) { } }void Test(){ // this works as long as Hello has a void return type FuncFoo,Actionstring a = foo = foo.Hello;} 当我将Hello的返回类型更改为in
我正在尝试在lambda表达式中使用方法组,如下所示:

public class Foo { public void Hello(string s) { } }

void Test()
{
    // this works as long as Hello has a void return type
    Func<Foo,Action<string>> a = foo => foo.Hello;
}

当我将Hello的返回类型更改为int时,我得到了

‘Bar.Hello(string)’ has the wrong return type.

我试过用Func代替Action,但这似乎阻止我使用方法组语法.

有任何想法吗?

(我的目标,fwiw,是能够引用具有不同返回类型和大量字符串参数的众多方法.我甚至不想打电话给它们 – 我只想反思它们的属性.我喜欢安全性然而,lambda只是键入方法名称字符串.)

编辑:澄清我想要使用Action的理由< string>:我的示例中的int可以是多种类型中的任何一种.我尝试模仿那种类型 –

void Set<T>(Func<Foo,Func<string,T>> a) { }
void Test() { Set(foo => foo.Hello); }  // fails

– 但是编译器无法导出T(大概是出于同样的原因我不能在返回类型上重载?).

还有其他想法吗?只要我能让编译器检查该方法组的名称,我就不会在这种情况下反对一些疯狂的反思.

解决方法

当它具有非void返回类型时,它不再与Action< string>兼容.换句话说,这也会失败:

int Foo(string s) { return 10; }

// Error: wrong return type
Action<string> action = new Action<string>(Foo);

由于不允许这样做的原因,请参阅Eric Lippert在“The void is invariant”上发表的博客文章.

您应该能够使用方法组语法,如下所示:

public class Foo { public int Hello(string s) { return 10; } }

void Test()
{
    Func<Foo,int>> a = foo => foo.Hello;
}

这在VS2008和VS2010中都适用. C#4的方法组转换和类型推断已经发生了一些变化 – 不幸的是细节让我感到惊讶 – 但我不相信这种情况会受到这些变化的影响.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读