2

これは現実の問題ではないことはわかっていますが、リフレクションやトリックなしで、すべての既定のパラメーターを使用してインデクサーにアクセスできますか?

たとえば、次のように呼び出します。

public int this[string val="", int sth=5]
{
    get
    {
         return 0;
    }
    set
    {
    }
}

パラメータを明示的に指定せずに?

のようなことを考えますmyobject[]が、明らかに間違っています。

意味がないことをコンパイラが警告しないのはなぜですか?

4

2 に答える 2

0

ポイントは、あなたがそれについて考えるならば、それは完全に理にかなっているということです.

問題全体は、C++ から取り入れたいくつかの習慣に基づいています。デフォルトのパラメーターがある場合は、パラメーター リストの最後に配置されます。C#でも同じ方法です。

C++ と C# の主な違いは、後者ではメソッド パラメータに名前でアクセスできることです。C++ とは異なり、メソッドの宣言に含まれる順序ですべてのパラメーターを指定する必要がありますが、C# では次のことが完全に合法です。

class Sth
{
    public int this[string val="", int sth=5]
    {
        get
        {
             return 0;
        }
        set
        {
        }
    }

    public Sth()
    {
        var i = this[sth: 6];
    }
}

この表記法は、標準の C++ では使用できません。

したがって、インデクサーのすべてのパラメーターに既定値があるとしても、パラメーターの 1 つ (またはサブセット) を使用して実行する場合は、これが意味を持つ可能性があります。

これは、自動的に 2 番目の質問につながります。既定値を持つパラメーターが 1 つしかないインデクサーはどうでしょうか。

class Sth
{
    public int this[int sth=5]
    {
        get
        {
             return 0;
        }
        set
        {
        }
    }
}

世界は正気のままです。実際にはインデクサーを「適切な方法」で (つまり、リフレクションやその他のハッキーなメカニズムなしで) 使用することはできませんが、警告が表示されます。Mono (おそらく .NET も) では、次のようになります。

警告 CS1066: オプションのパラメーター 'sth' に指定された既定値は使用されません (CS1066)

実際には、パラメーターに明示的な値を指定せずに呼び出すことはできません。

最初に単一パラメーターのインデクサーについて考えれば、問題全体を解決するのははるかに簡単になります。しかし、まあ、私はしませんでした。;-)

于 2013-06-21T07:29:14.540 に答える