函数定义中在命名参数后追加参数为何会触发报错?
Dart 函数命名参数的位置语法规则
报错核心原因
这是Dart语言对函数参数顺序的强制语法约束导致的,并非业务逻辑或运行时问题。
Dart的函数参数分为两大类别,语法明确要求:
- 所有用
{}包裹的命名参数,必须放置在整个函数参数列表的最末尾位置,不允许穿插在普通的位置参数中间。 - 普通的必选位置参数、用
[]包裹的可选位置参数,必须全部排在命名参数的前面。
两段代码的对比分析
- 触发报错的
namesV0函数
问题点:带默认值的命名参数void namesV0(String name1 , {String name2 ='NotFound'}, String name3 , int edad) {}{String name2 ='NotFound'}被放在了位置参数name1和后面的name3、edad之间,直接违反了命名参数必须放在参数列表末尾的语法要求,因此在代码解析阶段就会抛出语法错误。 - 可正常运行的
namesV1函数
合规点:所有必选位置参数void namesV1(String name1 , String name3, int edad, {String name2 ='NotFound'}) {}name1、name3、edad全部排列在参数列表前段,命名参数{String name2 ='NotFound'}放在了整个参数列表的最末尾位置,完全符合语法规范,因此可以正常运行。
补充说明
- 命名参数是否设置默认值,不影响位置规则的校验,哪怕带默认值的命名参数放错位置,同样会触发报错。
- 如果有在参数列表中间插入可选参数的需求,应该使用
[]包裹的可选位置参数实现,不能使用{}定义的命名参数。
内容的提问来源于stack exchange,提问作者salinashf
相关产品推荐
相关产品推荐

