Без сомнения, вы знаете, что если вы опустите член Test(x,y)
из типа Descendant
- или просто переименуете его Test2(x,y)
- тогда код C # будет скомпилирован и запущен, как и ожидалось.
Просмотр IL, сгенерированного для вашего исходного типа Descendant
, дает подсказку:
.method public hidebysig virtual
instance int32 Test (
int32 x
) cil managed ...
.method public
instance int32 Test (
int32 x,
int32 y
) cil managed ...
Обратите внимание, что в методе Test(x,y)
отсутствует атрибут hidebysig
.
The Спецификация ECMA CLI может сказать о hidebysig
следующее.(Раздел 15.4.2.2, выделение жирным шрифтом - мое.)
hidebysig
поставляется для использования инструментов и игнорируется VES.Он указывает, что объявленный метод скрывает все методы базовых типов классов, которые имеют совпадающую сигнатуру метода; если не указано, метод должен скрывать все методы с одинаковыми именами, независимо от сигнатуры .
Таким образом, компилятор F # пропускает атрибут hidebysig
, что означает, что *Метод 1029 * скрывает все остальные методы с именем Test
.Хотя hidebysig
предназначен только для «использования инструментов», похоже, что компилятор C # является одним из тех инструментов, которые его используют!
Мне кажется, это может быть ошибка в компиляторе F #,но так как я никогда не смотрел на спецификацию F #, всегда возможно, что это разрешенное / указанное поведение.