我正在考虑List的功能,而不考虑Count()是一个扩展方法的事实,当我做出错误的假设,我可以编写一个具有相同命名属性和方法的类。我当时的想法是,我可以为特殊情况“参数化一个属性”。
我现在意识到我可以做到,只要我使用扩展方法。
这是故意不允许在课程中但允许扩展或仅仅是不存在的功能吗?
void Main()
{
var list = new List<string>();
// You compile code that gets the property named Count
// and calls the method named Count()
list.Add("x");
Console.WriteLine (list.Count);
list.Add("x");
Console.WriteLine (list.Count());
var c = new C();
Console.WriteLine (c.Count);
Console.WriteLine (c.Count());
}
public class C
{
public int Count { get { return 3; } }
// But you cannot compile a class that contains both a property
// named Count and a method named Count()
//public int Count () { return 0; } // <-- does not compile
}
public static class X
{
public static int Count(this C c)
{
return 4;
}
}
答案 0 :(得分:3)
我记得像10年前一样在微软的一个小组上提出这个问题:
http://www.developmentnow.com/g/36_2003_9_0_0_195928/methods-and-properties-of-the-same-name.htm
正如你所看到的,没有令人信服的答案。
这在CIL中很容易实现,因为属性转换为getXX
/ setXX
方法的paris。
答案 1 :(得分:1)
这是因为Count(this C c)
是一种扩展方法,实际上并不构成该类型的一部分。
这意味着您可以在Count()
+扩展C
中拥有方法Count()
。如果你调用它,将被称为实例方法。
因此,如果我们考虑一个房产,那么问题就更少了。