C#中重载函数的执行顺序

Posted

技术标签:

【中文标题】C#中重载函数的执行顺序【英文标题】:Execution Order Of Overloaded Functions in C# 【发布时间】:2014-10-21 20:28:19 【问题描述】:

只是想知道 C# 如何确定方法重载中对象的执行顺序 例如我有一个方法

bool SomeMethod(IQueryable source)

  //.... Do Work


bool SomeMethod(IEnumerable source)

   //.... Do Work


var Obj = Db.Table.Where(ID > 5);

SomeMethod(Obj);

当我运行此代码时,代码会转到 IQueryable 重载,现在是因为我首先声明了 IQueryable,是因为 IQueryable 是 IEnumerable 类型还是有其他根本原因?

-谢谢

【问题讨论】:

【参考方案1】:

有一个更好的算法(C# 规范的第 7.4.3 节)用于决定在有多个适用的重载的情况下使用哪个方法重载。在这种情况下,IQueryable 可以隐式转换为IEnumerable,但IEnumerable 不能隐式转换为IQueryable,从而使IQueryable 成为“更好”的重载。

另见7.4.2.3 Better conversion

【讨论】:

【参考方案2】:

.NET 编译器一直在寻找最具体的重载。假设您有一个接受单个参数的简单函数,其中包含对象和字符串参数的重载。如果你传递一个字符串,字符串是一个对象,但字符串重载更具体,所以它会被调用。对于复杂的函数签名和许多重载,有时您会收到“不是最具体的”编译器错误。另见:

Overload resolution failed because no accessible 'method' is most specific for these arguments:error

【讨论】:

以上是关于C#中重载函数的执行顺序的主要内容,如果未能解决你的问题,请参考以下文章

C#视频方法重载函数重载传值

我可以从 C# 中同一类的另一个构造函数调用重载构造函数吗?

了解下C# 运算符重载

PHP 是不是具有 C#、JAVA、C++ 等函数重载功能 [重复]

在C#中,关于重载方法的说法正确的是(D)。 (选择一项)

Go中函数重载的替代方案?