扩展方法的一些疑问

choueny 2017-09-06 08:25:33
比如有一个扩展方法:
public static void ExtendFunc<T>(this List<T> list)
{
//.....
}


那么用户可以直接这样调用:
List<string> list = new List<string>();
list.ExtendFunc();


我现在的疑问是,编译器是怎么发现变量list有一个扩展方法ExtendFunc()的呢? 如果一个扩展方法有泛型参数,比如上面的定义,就感觉很别扭.........

我的猜想是这样的:
首先检测到list是一个List<string> , 尝试调用ExtendFunc()时,检测List<string>是否符合List<T>,如果符合,把string传送给ExtendFunc方法中的T,否则无法调用。

请问各位大大们都是怎么理解的呢?



...全文
188 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ilikeff8 2017-09-07
  • 打赏
  • 举报
回复
在编译的时候,只是把你自定义的方法加入相关类型的方法“列表”里,可以看成是可扩展的类型都有“系统“和“自定义”的方法列表,编译的时候会同时找这两部分 最终效果就和那些语法糖一样,最后还是在编译的时候自动转换和编译成合适的中间代码
闭包客 2017-09-07
  • 打赏
  • 举报
回复
引用 1 楼 closurer 的回复:
检查 using 的命名空间,里面有没有对应的扩展方法就行了。 泛型在编译时不需要知道具体类型。
其实你说的也没什么错,只是一些术语表达的问题。编译是对代码做语法分析,不是调用。 更正一下:C# 泛型在编译时会生成具体类型的一个副本,而 Java 不是这样。
xuzuning 2017-09-07
  • 打赏
  • 举报
回复
编译无非是查表,简单机械,没有那么多复杂判断 你想一下编译器是如何知道 List 有 Add 方法的就能明白 按约定,扩展方法的第一个参数需要有带 this 修饰的类型声明,编译器据此将扩展方法名添加到相应类型的方法表中 泛型符号在编译时都被替换成真实类型
threenewbee 2017-09-06
  • 打赏
  • 举报
回复
在ask板块回复你了,这里就不重复了。
  • 打赏
  • 举报
回复
编译器在进行语义分析之前,它已经获得了语法表达。它自然是要计算出 string 跟 T 是匹配的。 但是不是说编译器去调用那个函数。这就好像是黄瓜说成是勺子,完全是另一个领域的随便的猜测!
  • 打赏
  • 举报
回复
"尝试调用ExtendFunc()时"?晕啊!你这个是把编译跟解释执行完全混淆了。 编译器从来不调用什么函数,这里对编译的概念、目标、过程、功能完全是荒谬的想法。
大米粥哥哥 2017-09-06
  • 打赏
  • 举报
回复
编译器会先检测相应格式吧 扩展的格式写对了它就可以识别
闭包客 2017-09-06
  • 打赏
  • 举报
回复
检查 using 的命名空间,里面有没有对应的扩展方法就行了。

泛型在编译时不需要知道具体类型。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧