dart - 这是Dart编译器的默认设置吗?

标签 dart compiler-errors

我花了几个小时在 Dart 程序中发现错误。
最多,我发现类似以下内容:

class User{  
 String name;  
 User(String name){  
  name = "user +$name";  
}
}

内部属性应该是 _name ,但是开发人员忘记了此规则。
该代码将空结果提供给:
User u1 = new User("U1");  
  print(u1.name);  
> null

我的问题是:
我感到奇怪的是,编译器允许在调用参数和代码内部重用相同的var名称而没有任何警告。
我认为,如果某些参数类似于* User(String name)*,则name的进一步使用应为只读。

这是语言的弱点吗?
您是否看到过其他语言的相同PB?

最佳答案

我可以看到您来自哪里,但这是与Java相同的作用域规则(以及C#吗?),以及方法和构造函数的参数的正常行为。

我认为用另一个值重新分配参数是不良行为,您可以通过向analysis_options.yaml添加以下linter规则来使分析器检测到该错误:

linter:
  rules:
    parameter_assignments

规则描述如下:
http://dart-lang.github.io/linter/lints/parameter_assignments.html

但是我可以看到,此规则不适用于您所使用的构造函数,并且我想这可能是linter的错误,或者是应该存在另一条规则来检测构造函数的参数的情况。因此,我建议您在此处创建一个问题:https://github.com/dart-lang/linter/issues

可以通过对每个参数使用final来实现参数(方法和构造函数)的只读行为:

  User(final String name) {
    name = 'user +$name'; // error: 'name' a final variable can only be set once
  }

但这在希望防止开发人员忘记做某事的事故的意义上是不实际的。

仅作记录,您可以通过执行以下操作在name类中分配User值(如果您仍然希望参数和类变量具有相同的名称):
class User {
  String name;

  User(String name) {
    this.name = 'user +$name';
  }
}

关于dart - 这是Dart编译器的默认设置吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58497685/

相关文章:

Flutter:如何使对话框的按钮居中?

c++ - FMOD 结果未被识别为有效类型?

android - flutter 意外退出

flutter 错误 : The argument type 'DocumentSnapshot<Object?>? can' t be assigned to parameter 'DocumentSnapshot<Object? >

flutter - 在 flutter 中生成项目符号点

dart - 执行 `dart2js` 时生成哪些文件?为什么?

testing - Flex Builder : Asset file or directory name cannot be more than 100 bytes long

c++ - C++错误: C4430 and C2143 Error at an impossible place

java - (Java) 找不到方法

java - Spring 4框架编译错误