首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >方法组重载解析与方法调用重载解析有什么不同?

方法组重载解析与方法调用重载解析有什么不同?
EN

Stack Overflow用户
提问于 2010-06-14 19:10:22
回答 2查看 280关注 0票数 6

以下代码无法编译(error CS0123: No overload for 'System.Convert.ToString(object)' matches delegate 'System.Converter<T,string>'):

代码语言:javascript
复制
class A<T> {
    void Method(T obj) {
        Converter<T, string> toString = Convert.ToString;

        // this doesn't work either (on .NET 4):
        Converter<object, string> toString2 = Convert.ToString;
        Converter<T, string> toString3 = toString2;            
    }
}

但是,这样做:

代码语言:javascript
复制
class A<T> {
    void Method(T obj) {
        // o is a T, and Convert.ToString(o) is using
        // string Convert.ToString(object o)

        Converter<T, string> toString = o => Convert.ToString(o);
    }
}

在c# 4中,协变/逆变委托可以相互赋值,并且可以从协变/逆变方法创建委托,因此ToString(object)方法可以用作Converter<T, string>,因为T总是被保证可以转换为object

因此,第一个示例(方法组重载解析)应该是查找唯一适用的方法string Convert.ToString(object o),与方法调用重载解析相同。为什么方法组和方法调用重载解析会产生不同的结果?

EN

Stack Overflow用户

发布于 2010-06-14 19:24:29

第二段代码之所以会编译,是因为o是从object派生的,所以很明显,您可以调用一个以object作为输入并带有任何类型参数的方法。

然而,委托类型并不相等。除非Tobject,否则方法签名不匹配。比方说,如果Tint,你就会得到一个不同于Converter<object, stringConverter<int, string>。它们是两个完全不同类型的。

你遇到了围绕C# 3.0缺乏协方差/逆方差的问题。在C# 4中应该会更好。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3036705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档