ポイントは、あなたがそれについて考えるならば、それは完全に理にかなっているということです.
問題全体は、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)
実際には、パラメーターに明示的な値を指定せずに呼び出すことはできません。
最初に単一パラメーターのインデクサーについて考えれば、問題全体を解決するのははるかに簡単になります。しかし、まあ、私はしませんでした。;-)