Странная ошибка CLR при обработке типов Nullable в Oxygene .net

Я пишу программу в Oxygene .net. Кажется, есть проблема с тем, как я обрабатываю типы, допускающие значение NULL.

    namespace RULER;

interface

uses
  System,
  System.Drawing,
  System.Collections,
  System.Collections.Generic,
  System.Windows.Forms,
  System.ComponentModel;

type
  /// <summary>
  /// Summary description for Settings.
  /// </summary>
  Settings = public partial class(System.Windows.Forms.Form)
  private
      method Settings_Shown(sender: System.Object; e: System.EventArgs);
      method GetLowerBound : System.Nullable<Double>;
      method SetLowerBound(lowerbound:System.Nullable<Double>);
      method Settings_Load(sender: System.Object; e: System.EventArgs);
      method btnOK_Click(sender: System.Object; e: System.EventArgs);
  protected
      method Dispose(aDisposing: Boolean); override;
  public
      property LowerBound : System.Nullable<Double> read GetLowerBound write SetLowerBound;
    constructor;
  end;

implementation

{$REGION Construction and Disposition}
constructor Settings;
begin
  //
  // Required for Windows Form Designer support
  //
  InitializeComponent();

  //
  // TODO: Add any constructor code after InitializeComponent call
  //
end;

method Settings.Dispose(aDisposing: Boolean);
begin
  if aDisposing then begin
    if assigned(components) then
      components.Dispose();

    //
    // TODO: Add custom disposition code here
    //
  end;
  inherited Dispose(aDisposing);
end;
{$ENDREGION}

method Settings.Settings_Shown(sender: System.Object; e: System.EventArgs);
begin
    LowerBound := System.Nullable<Double>(Controller.configuration.LowerBound);
end;

method Settings.GetLowerBound : System.Nullable<Double>;
begin
    var bound : Double;
    if Double.TryParse(txtLowerBound.Text, out bound) then
    begin
        Result := bound;
    end else
    begin
        Result := System.Nullable<Double>(nil);
    end;
end;

method Settings.SetLowerBound(lowerbound:System.Nullable<Double>);
begin
    if lowerbound.HasValue then
    begin
        txtLowerBound.Text := lowerbound.Value.ToString;
    end else
    begin
        txtLowerBound.Text := '';
    end;
end;

method Settings.Settings_Load(sender: System.Object; e: System.EventArgs);
begin

end;

method Settings.btnOK_Click(sender: System.Object; e: System.EventArgs);
begin
    var LB : System.Nullable<Double> := Self.GetLowerBound;

    if LB.HasValue then
    begin
        Controller.configuration.LowerBound := LB.Value;
    end;
end;

end.

Когда я нажимаю кнопку, запускающую событие btnOK_Click, я получаю странное сообщение об ошибке.

Среда выполнения обнаружила фатальную ошибку. Адрес ошибки был 0x691886da, поток 0x770. Код ошибки 0xc0000005. Эта ошибка может быть ошибкой в ​​среде CLR или в небезопасных или непроверяемых частях пользовательского кода. Распространенными источниками этой ошибки являются ошибки маршалинга пользователя для COM-interop или PInvoke, которые могут повредить стек.


person sav    schedule 18.04.2013    source источник


Ответы (3)


Между прочим, я бы предложил использовать встроенную в Oxygene языковую функцию «nullable», так как она работает намного прозрачнее и интуитивно понятнее, чем System.Nullable. например:

method Settings.GetLowerBound : nullable Double;
begin
    var bound : Double;
    if Double.TryParse(txtLowerBound.Text, out bound) then
    begin
        Result := bound;
    end else
    begin
        Result := nil;
    end;
end;

Несмотря на это, получение «Среда выполнения обнаружила фатальную ошибку». указывает на ошибку компилятора. Я зарегистрирую проблему на нашей стороне с вашим тестовым набором.

person marc hoffman    schedule 18.04.2013

Похоже, это ошибка компилятора. Я отправил информацию для RemObjects, чтобы сообщить об ошибке и исправить ее. А пока вы можете попробовать более новую версию (или, может быть, бета).

person Jim McKeeth    schedule 18.04.2013
comment
зарегистрирован в нашей внутренней базе данных ошибок как bugs://61996: Среда выполнения обнаружила фатальную ошибку. с обнуляемым приведением - person marc hoffman; 18.04.2013
comment
где мне лучше всего отправлять отчеты об ошибках в будущем? - person sav; 19.04.2013
comment
электронная почта support@ для remobjects.com - person Jim McKeeth; 19.04.2013
comment
Между прочим, это исправлено в новой еженедельной бета-версии .1259, которая будет доступна в течение следующего часа (beta.remobjects.com, требуется авторизация) - person marc hoffman; 19.04.2013

Я считаю, что решение состоит в том, чтобы заменить

Result := System.Nullable<Double>(nil);

С участием

Result := new System.Nullable<Double>;
person sav    schedule 18.04.2013