编译器 select 如何在具有相似签名的 2 之间使用方法?

How compiler select method between 2 with similar signature?

我有枚举

public enum ContentMIMEType
{
    [StringValue("application/vnd.ms-excel")]
    Xls,

    [StringValue("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")]
    Xlsx
}

在扩展中,我有 2 种获取属性值的方法:

public static string GetStringValue<TFrom>(this TFrom enumValue) 
            where TFrom : struct, IConvertible
{
    ...
}

public static string GetStringValue(this Enum @enum)
{
    ...
}

这些方法有不同的签名,但是当我执行下一个操作时ContentMIMEType.Xlsx.GetStringValue()采用第一种方法。

为什么会这样,因为对我来说执行第二种方法更明显(尝试更改排序顺序,但没有帮助)。

Here更多。

仅来自网站:

overloading is what happens when you have two methods with the same name but different signatures. At compile time, the compiler works out which one it's going to call, based on the compile time types of the arguments and the target of the method call.

并且当编译器无法推导出正确的时,编译器return 错误。

编辑

基于 Constraints on type parameters and Enum Class enum 是结构并实现 IConvertible 所以满足要求和编译器使用首先匹配。与 Enum 没有冲突,因为 Enum 在继承层次上比 struct 更好。

签名:

public static string GetStringValue<TFrom>(this TFrom enumValue) 

是通用签名,也就是说允许被当作:

public static string GetStringValue<ContentMIMEType>(this ContentMIMEType enumValue) 

哪个比:

更具体
public static string GetStringValue(this Enum @enum)

因此选择了方法。