关于参数为表达式的方法重载的一个bug

老张一笑 2015-11-06 01:39:42
首先个人觉得是个bug.
不是运行bug,是vs的重载提示的问题.

环境VS2010 .net 4.0
代码如下:

public class Person
{
public string Name { set; get; }
public string Age { set; get; }
}
public class TestObject
{
public string AA { set; get; }
public string BB { set; get; }
}
public class Test
{
//修饰符非public
private void Update(Func<Person, object> whereFun)
{

}
public void Update(Func<TestObject, bool> whereFun)
{

}
}


大家可以试试,当调用Update的时候,居然默认智能提示是private的方法.
Test t = new Test();
t.Update(s=>s. //当输入这里的时候居然 "点" 出来的是 Person 成员.
更奇怪的是,当把两个方法的代码位置更换一下,奇怪的现象有发生了,居然"点"出来了TestObject对象成员(刚刚发现)
虽然影响不大,也很好处理, 我确实花了一个多小找到问题所在
...全文
95 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
老张一笑 2015-12-15
  • 打赏
  • 举报
回复
引用 2 楼 dongxinxi 的回复:
这种情况返回哪一个都不合适,不同的人期望的调用目标不一样 没必要跟VS较劲,自己显式指定类型或者将设计改成 //修饰符非public public void Update<T, R>(Func<T, R> whereFun) where T : ITest { } 差异化的东西由具体的类型T去实现接口,要不然有多少子类型,Test里面就要弄多少个重载?
这个这是写了个测试代码,证明了下我原代码是没问题的,至于private 的方法,在实际中确实有用到,我实际中的代码和你给出的写法是一致的, 我在调用的时候不能达到理想的智能提示,后来抽时间去详细测试才得出来这样的结论,也是希望以后又碰到类似问题的朋友少走些弯路.
  • 打赏
  • 举报
回复
假如后来别人增加了新的类型,你的Test类也改不了,只能放到其他的地方了
  • 打赏
  • 举报
回复
这种情况返回哪一个都不合适,不同的人期望的调用目标不一样 没必要跟VS较劲,自己显式指定类型或者将设计改成 //修饰符非public public void Update<T, R>(Func<T, R> whereFun) where T : ITest { } 差异化的东西由具体的类型T去实现接口,要不然有多少子类型,Test里面就要弄多少个重载?
xdashewan 2015-11-06
  • 打赏
  • 举报
回复
我用2010测试,的确有这个问题,但如果你顺着他提示去做,最终编译会提示你访问其实是访问不到的,而虽然没有提示,但你强行指定AA或者BB编译和运行都是没有问题的,这问题也许在后面版本VS就被解决了也说不定。

110,538

社区成员

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

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

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