Почему я не могу наследовать от System.Кортеж в F#

#f# #sealed

#f# #запечатанный

Вопрос:

используя Visual Studio 2017, я пытаюсь скомпилировать следующий фрагмент F #

 type Foo() =
inherit System.Tuple<string,string>("","")
  

который терпит неудачу, сообщая мне, что я не могу наследовать от запечатанного типа. Я проверил FSharp.Ядро и оно не запечатано. Я также убежден, что это скомпилировано с VS 2010.

Есть идеи? Это вызвано дополнительными метаданными F #? Я знаю, что F # обрабатывает кортежи особым образом

Комментарии:

1. Я получаю то же сообщение, я подозреваю, что оно на самом деле запечатано для F #. То, что вы здесь делаете, определенно выходит за рамки нормы. Что вы собираетесь делать? Вероятно, есть хороший способ сделать то, что вы на самом деле пытаетесь сделать, не создавая новый унаследованный тип.

2. Кортеж, определенный в FSharp. Core существует только для обратной совместимости с версиями .NET Framework, которые не имеют встроенной системы. Тип кортежа (до версии 4.5). В большинстве случаев вы на самом деле используете систему. Кортеж, определенный во время выполнения, а не в FSharp.Core. Возможно, тип среды выполнения запечатан, или что-то в перенаправлениях типов, связанных с использованием типа среды выполнения, означает, что F # должен обрабатывать его так, как будто он запечатан?

3. @MichalMa это у вас там реальный производственный сценарий? Еще одна причина остаться на старом добром VS2010 😉

Ответ №1:

Начиная с F # 4.1, F # обрабатывает все System.Tuple экземпляры как кортеж F #, от которого нельзя наследовать.