Поделиться через


Критические изменения в F# версии 3.0

В этом разделе описываются критические изменения в версии 3.0 компилятора F# и языке для выпуска Visual Studio 2012.

Список критических изменений

В следующей таблице перечисляются критические изменения в F# 3.0.

Область критических изменений

Описание

Отступ

Некоторые неверные отступы, которые были ошибочно приняты предыдущими версиями компилятора F#, создают ошибку компиляции в текущей версии.Подробное описание правил отступа см. в разделе Рекомендации по форматированию кода (F#).

Кавычки, методы и свойства структур, которые являются локальными переменными

Вызов свойства или метода структуры в кавычках, если эта структура является локальной переменной, теперь является ошибкой.Предыдущие версии F# допускали такое поведение.

[<Struct>]
type S =
   member this.Valid = true
let check () =
    let mutable s = S()
    <@ s.Valid @> // Error

Чтобы избежать этого требования создайте копию локальной переменной, как показано в следующем примере:

let check () =
    let s = S()
    <@ 
        let s = s
        s.Valid 
    @>

Равенство с неверными значениями null

В предыдущих версиях можно было бы сравнить значение null, используя оператор = независимо от того, является ли это значение верным или неверным для этого типа.Правильное значение null является значением null, которое допускает тип; неверное значение null не является допустимым значением для типа.На данный момент исключение NullReferenceException создается каждый раз, когда оператор = используется для сравнения неверных значений null, как показано в следующем коде.

let a : int ref = Unchecked.defaultof<_>
let main() =
    printfn "%A" (a = a)
main()

Комментарии и строки

В предыдущих версиях заключительный маркер комментария *) в строке в тройных кавычках (""") был трактован как часть строки.В текущей версии этот маркер анализируется как последний знак комментария.Поэтому следующий код, который ранее был принят, вызовет ошибку в текущей версии.

(* """ *)
Let x = 1

Для получения дополнительной информации см. Строки (F#).

Свойства, которые имеют различные типы методов задания и присвоения.

В более ранних версиях языка F# компилятор F# неверно позволял методам получения и задания иметь типы, которые не соответствуют (например, получения экспортированного типа int и метод присвоения строкового типа).В F# 3.0 компилятор сообщает о таком объявлении как об ошибке.