3

私は 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;
    }
}
4

2 に答える 2

3

マイクロソフト グループの 1 つで、10 年前のようにこの質問をしたことを覚えています。

http://www.developmentnow.com/g/36_2003_9_0_0_195928/methods-and-properties-of-the-same-name.htm

ご覧のとおり、説得力のある答えはありませんでした。

getXXプロパティは/setXXメソッドのパリに変換されるため、これはもちろんCILで簡単に可能です。

于 2012-05-23T18:12:02.123 に答える
1

これはCount(this C c)拡張メソッドであり、実際には型の一部を構成しないためです。

つまりCount()C+ extension でメソッドを使用できますCount()。呼び出す場合は、インスタンスメソッドと呼ばれます。

したがって、プロパティについて考えると、それに関する問題はさらに少なくなります。

于 2012-05-23T18:01:34.483 に答える