gpt4 book ai didi

c# - 方法组重载决议与方法调用重载决议有何不同?

转载 作者:太空狗 更新时间:2023-10-29 21:52:14 26 4
gpt4 key购买 nike

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

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;
}
}

但是,这样做:

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 中,co/contra-variant 委托(delegate)可以相互分配,委托(delegate)可以从 co/contra-variant 方法创建,因此 ToString(object)方法可以用作 Converter<T, string> , 作为 T始终保证可转换为 object .

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

最佳答案

这与变体不适用于值类型这一事实有关,因此如果您像 where T : class 那样限制 T 您会在 上获得变体T 和第一段代码将编译。

来自Covariance and Contravariance FAQ :

Variance is supported only if a typeparameter is a reference type.Variance is not supported for valuetypes.

关于c# - 方法组重载决议与方法调用重载决议有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3036705/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com