编译器如何在两个签名相似的方法之间选择



我有Enum

public enum ContentMIMEType
{
[StringValue("application/vnd.ms-excel")]
Xls,
[StringValue("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")]
Xlsx
}

在扩展中,我有两种方法来获得属性值:

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

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

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

为什么会发生这种情况,因为对我来说,第二个方法的执行更明显(我试图改变排序顺序,但无济于事(。

以下是更多信息。

简单地从网站:

重载是指当您有两个方法具有相同名称,但签名不同。在编译时,编译器计算出根据参数和方法调用的目标。

当编译程序无法扣除哪个是正确的时,编译程序返回错误。

编辑

基于对类型参数和枚举类的约束,枚举是IConvertible的结构和实现,因此满足要求,编译器使用首先匹配。与Enum没有冲突,因为Enum是继承层次结构中的情人而非结构。

签名:

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

是一个通用签名,这意味着它可以被视为:

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

哪个比更具体

public static string GetStringValue(this Enum @enum)

因此选择了这种方法。

相关内容

  • 没有找到相关文章

最新更新