Skip to content

Copying a read-only List with GetRange() crashes the client with casting error #6697

@dzzzb

Description

@dzzzb

I found #6696 while just trying to get a list of enum Names() and chop off the 1st one representing the blank values. Now I'm trying to be clever and work around that by taking a GetRange() of the Names() list and omit the 1st name that way. I shouldn't have tried to be clever! I just get a different, worse error/crash.

Shouldn't it be OK to take a read-only 'view' List of a read-only list, so long as we don't then try to mutate the 'view' copy (and see #6696 for that)?

If not, can this be diagnosed at compile-time, as I also request for #6696?

the code:

pageextension 66666 Test extends "Customer List"
{
    trigger OnOpenPage()
    var
        Names, Range : List of [Text];
    begin
        Names := Enum::"Customer Blocked".Names();
        Range := Names.GetRange(2, Names.Count() - 1);
    end;
}

result:
image

the error from Event Viewer:

Server instance: bc17cu1
Tenant ID: 
Environment Name: 
Environment Type: 
User: [me]
Type: System.InvalidCastException
Message: Unable to cast object of type 'System.Collections.ObjectModel.ReadOnlyCollection`1[Microsoft.Dynamics.Nav.Runtime.NavText]' to type 'System.Collections.Generic.List`1[Microsoft.Dynamics.Nav.Runtime.NavText]'.
StackTrace:
     at Microsoft.Dynamics.Nav.Runtime.TrappableOperationExecutor.ExecuteFactory[T](Func`1 factory, Func`2 mapNativeException)
     at Microsoft.Dynamics.Nav.BusinessApplication.PageExtension66666.OnOpenPage_Scope.OnRun()
     at Microsoft.Dynamics.Nav.Runtime.NavMethodScope.Run()
     at Microsoft.Dynamics.Nav.BusinessApplication.PageExtension66666.OnOpenPage()
     at Microsoft.Dynamics.Nav.Types.LinqExtensions.ForEach[TSource](IEnumerable`1 source, Action`1 action)
     at Microsoft.Dynamics.Nav.Runtime.NavForm.RaiseOnOpenPage()
     at Microsoft.Dynamics.Nav.Runtime.NavForm.OpenForm()
     at Microsoft.Dynamics.Nav.Service.NSFormBatchOpen.<>c__DisplayClass15_1.<HandleRegistrateDataAccess>b__0(NsDataAccess dataAccess)
     at Microsoft.Dynamics.Nav.Service.NsFormDataAccess.RunWithFormDataAccess(ITreeObject parent, NavForm form, Action`1 action)
     at Microsoft.Dynamics.Nav.Service.NsDataAccess.RunWithDataAccess(ITreeObject parent, NavRecordState state, Boolean instantiateNewForm, Guid parentFormHandle, String parentControlName, Boolean& instantiatedForm, Action`1 action)
     at Microsoft.Dynamics.Nav.Service.NsDataAccess.RunWithDataAccess(ITreeObject parent, NavRecordState state, Action`1 action)
     at Microsoft.Dynamics.Nav.Service.NSFormBatchOpen.HandleRegistrateDataAccess(FormOpenResponse openResponse, List`1 registeredForms)
     at Microsoft.Dynamics.Nav.Service.NSFormBatchOpen.Open(NavSession session)
     at Microsoft.Dynamics.Nav.Service.NSService.OpenForm(OpenFormRequest form)
     at SyncInvokeOpenForm(Object , Object[] , Object[] )
     at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationInvoker.RunInTransactionCombinator(ServiceOperation innerOperation, NSServiceBase serviceInstance, MethodBase syncMethod, Object[] inputs, Object[]& outputs)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationInvoker.<>c__DisplayClass28_1.<Combine>b__1(NSServiceBase serviceInstance, Object[] inputs, Object[]& outputs)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationInvoker.TransientErrorRetryCombinator(ServiceOperation innerOperation, NSServiceBase serviceInstance, MethodBase syncMethod, Object[] inputs, Object[]& outputs)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationInvoker.<>c__DisplayClass28_1.<Combine>b__1(NSServiceBase serviceInstance, Object[] inputs, Object[]& outputs)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationInvoker.ErrorMappingCombinator(ServiceOperation innerOperation, NSServiceBase serviceInstance, MethodBase syncMethod, Object[] inputs, Object[]& outputs)
Source: Microsoft.Dynamics.Nav.Ncl
HResult: -2147467262
StackTrace:
     at Microsoft.Dynamics.Nav.Runtime.TrappableOperationExecutor.ExecuteFactory[T](Func`1 factory, Func`2 mapNativeException)
     at Microsoft.Dynamics.Nav.BusinessApplication.PageExtension66666.OnOpenPage_Scope.OnRun()
     at Microsoft.Dynamics.Nav.Runtime.NavMethodScope.Run()
     at Microsoft.Dynamics.Nav.BusinessApplication.PageExtension66666.OnOpenPage()
     at Microsoft.Dynamics.Nav.Types.LinqExtensions.ForEach[TSource](IEnumerable`1 source, Action`1 action)
     at Microsoft.Dynamics.Nav.Runtime.NavForm.RaiseOnOpenPage()
     at Microsoft.Dynamics.Nav.Runtime.NavForm.OpenForm()
     at Microsoft.Dynamics.Nav.Service.NSFormBatchOpen.<>c__DisplayClass15_1.<HandleRegistrateDataAccess>b__0(NsDataAccess dataAccess)
     at Microsoft.Dynamics.Nav.Service.NsFormDataAccess.RunWithFormDataAccess(ITreeObject parent, NavForm form, Action`1 action)
     at Microsoft.Dynamics.Nav.Service.NsDataAccess.RunWithDataAccess(ITreeObject parent, NavRecordState state, Boolean instantiateNewForm, Guid parentFormHandle, String parentControlName, Boolean& instantiatedForm, Action`1 action)
     at Microsoft.Dynamics.Nav.Service.NsDataAccess.RunWithDataAccess(ITreeObject parent, NavRecordState state, Action`1 action)
     at Microsoft.Dynamics.Nav.Service.NSFormBatchOpen.HandleRegistrateDataAccess(FormOpenResponse openResponse, List`1 registeredForms)
     at Microsoft.Dynamics.Nav.Service.NSFormBatchOpen.Open(NavSession session)
     at Microsoft.Dynamics.Nav.Service.NSService.OpenForm(OpenFormRequest form)
     at SyncInvokeOpenForm(Object , Object[] , Object[] )
     at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationInvoker.RunInTransactionCombinator(ServiceOperation innerOperation, NSServiceBase serviceInstance, MethodBase syncMethod, Object[] inputs, Object[]& outputs)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationInvoker.<>c__DisplayClass28_1.<Combine>b__1(NSServiceBase serviceInstance, Object[] inputs, Object[]& outputs)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationInvoker.TransientErrorRetryCombinator(ServiceOperation innerOperation, NSServiceBase serviceInstance, MethodBase syncMethod, Object[] inputs, Object[]& outputs)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationInvoker.<>c__DisplayClass28_1.<Combine>b__1(NSServiceBase serviceInstance, Object[] inputs, Object[]& outputs)
     at Microsoft.Dynamics.Nav.Service.ServiceOperationInvoker.ErrorMappingCombinator(ServiceOperation innerOperation, NSServiceBase serviceInstance, MethodBase syncMethod, Object[] inputs, Object[]& outputs)

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions