Почему компилятор не предупреждает меня об отсутствии смысла?
Потому что это действительно имеет смысл, просто не в C#. Свойство по умолчанию, которое индексируется с аргументами no, легко поддерживается в COM, например. И C# - это язык, который позволяет вам реализовывать COM-серверы. Очень просто сделать, просто примените атрибут [ComVisible (true)]. Использование COM-серверов в C# также очень популярно, так как обычный интерфейс Office - interop.
Это трение существует, поскольку существует значительная проблема с такими свойствами. Синтаксис сахара очень сладкий, но, как и любой сахар, он может производить гнилые зубы. Там очень неприятный синтаксис неоднозначность при использовании такого свойства, скажем, язык сценариев:
Dim obj As New Foo
obj = Nothing
Что было задумано здесь? Следует ли присвоить объект Ничего? Или должно быть присвоено свойство по умолчанию Nothing? Оба абсолютно законны, компилятор не может понять, какой из них лучше. Для языков Visual Basic (VBScript, VBA, VB6) эта неоднозначность была решена путем добавления дополнительного дополнительного слова на этом языке. Вы должны использовать Set, когда вы имели в виду объект, Let или nothing, чтобы назначить свойство по умолчанию. Это заставило многих начинающих программистов, которые получили начало в сценариях, понятие «объект» просто не очень понятно для них. И, конечно, очень легко угадать, это главный генератор ошибок.
Эта проблема оказала очень пагубное влияние на ядро взаимодействия, а также свойства COM могут иметь два устройства, PropPut и PropPutRef. То, что вы видите в методе IDispatch :: Invoke(). Языки .NET положили конец этому, не в последнюю очередь потому, что CLI этого не позволяет, они настаивают на том, что свойство по умолчанию должно иметь аргумент. Теперь он недвусмыслен для компилятора, он может определить, было ли назначение объекта предназначено, поскольку оно не использует аргумент индексатора.
Команде C# было особенно трудно убедить, что это должно быть изменено назад, они абсолютно ненавидят двусмысленность, а также должны. Первоначально они настаивали на том, что может быть только один индексированный объект и что это свойство должно быть быть свойством по умолчанию и иметь только один аргумент. Индексатор. Они, наконец, обрушились на версию 4, слишком много программистов, написание кода для взаимодействия с Office, для улучшения. Но взял его только по мере необходимости, хорошо в сценариях interop, но все еще не разрешен в коде C#. Вам придется называть get_Item() трудным путем. Или, конечно, просто не писать код, подобный этому ...