回答編集履歴

3

見直しキャンペーン中

2023/07/26 15:38

投稿

TN8001
TN8001

スコア9862

test CHANGED
@@ -1,93 +1,47 @@
1
1
  警告は`ToString()`に出てるんじゃないですか?
2
2
 
3
-
4
-
5
- ```C#
3
+ ```cs
6
-
7
4
  using System.Diagnostics.CodeAnalysis;
8
-
9
5
  #nullable enable
10
6
 
11
-
12
-
13
7
  public class Hoge
14
-
15
8
  {
16
-
17
9
  [NotNull] private object? A;
18
-
19
-
20
10
 
21
11
  public void Init() => A = new object();
22
12
 
23
-
24
-
25
13
  public void Method()
26
-
27
14
  {
28
-
29
15
  // CS8600 Null リテラルまたは Null の可能性がある値を Null 非許容型に変換しています。
30
-
31
16
  string xxx = A.ToString();
32
17
 
33
-
34
-
35
18
  // 警告は出ません
36
-
37
19
  string yyy = A.ToString() ?? "Null!";
38
-
39
20
  }
40
21
 
41
22
 
42
-
43
-
44
-
45
23
  // 蛇足
46
-
47
24
  private object B;
48
25
 
49
-
50
-
51
26
  // CS8618 null 非許容の フィールド 'A' には、コンストラクターの終了時に null 以外の値が入っていなければなりません。フィールド を Null 許容として宣言することをご検討ください。
52
-
53
27
  public Hoge() => InitB();
54
28
 
55
-
56
-
57
29
  [MemberNotNull(nameof(B))]
58
-
59
30
  private void InitB() => B = new object();
60
-
61
31
  }
62
-
63
32
  ```
64
-
65
-
66
33
 
67
34
  ---
68
35
 
69
-
70
-
71
36
  通じていない気がするので追記
72
37
 
73
-
74
-
75
38
  > 毎回!マークを付けるのではなくAをobject?型ではなくobject型として扱いたいです
76
-
77
39
  > 少し前までNotNullAttributeを付けておこえば、上記を実現出来たのですが、この方法はバグだったのかVSを最新にするとワーニングが出るようになってしまいました。
78
-
79
-
80
40
 
81
41
  `xxx`のところで「毎回bang(`!`)を付けるのが面倒だ」という話だと思っていたのですが、違うんでしょうか?
82
42
 
83
-
84
-
85
43
  `A`に警告が出るのは、ほかの方も指摘されているとおりです。
86
44
 
87
-
88
-
89
45
  しかし`xxx`に警告が出るのは全く別の話です。
90
-
91
46
  `Object`では`public virtual string? ToString()`となっています。
92
-
93
47
  ![イメージ説明](92b9701afb0357200979e2bde92bdeb4.png)

2

通じていない気がするので追記

2021/04/06 01:30

投稿

TN8001
TN8001

スコア9862

test CHANGED
@@ -61,3 +61,33 @@
61
61
  }
62
62
 
63
63
  ```
64
+
65
+
66
+
67
+ ---
68
+
69
+
70
+
71
+ 通じていない気がするので追記
72
+
73
+
74
+
75
+ > 毎回!マークを付けるのではなくAをobject?型ではなくobject型として扱いたいです
76
+
77
+ > 少し前までNotNullAttributeを付けておこえば、上記を実現出来たのですが、この方法はバグだったのかVSを最新にするとワーニングが出るようになってしまいました。
78
+
79
+
80
+
81
+ `xxx`のところで「毎回bang(`!`)を付けるのが面倒だ」という話だと思っていたのですが、違うんでしょうか?
82
+
83
+
84
+
85
+ `A`に警告が出るのは、ほかの方も指摘されているとおりです。
86
+
87
+
88
+
89
+ しかし`xxx`に警告が出るのは全く別の話です。
90
+
91
+ `Object`では`public virtual string? ToString()`となっています。
92
+
93
+ ![イメージ説明](92b9701afb0357200979e2bde92bdeb4.png)

1

警告間違い

2021/04/06 01:30

投稿

TN8001
TN8001

スコア9862

test CHANGED
@@ -14,9 +14,11 @@
14
14
 
15
15
  {
16
16
 
17
- // CS8618 null 非許容の フィールド 'A' には、コンストラクターの終了時に null 以外の値が入っていなければなりません。
17
+ [NotNull] private object? A;
18
18
 
19
+
20
+
19
- [NotNull] private object? A;
21
+ public void Init() => A = new object();
20
22
 
21
23
 
22
24
 
@@ -30,7 +32,7 @@
30
32
 
31
33
 
32
34
 
33
- // 何も出ません
35
+ // 警告は出ません
34
36
 
35
37
  string yyy = A.ToString() ?? "Null!";
36
38
 
@@ -46,15 +48,15 @@
46
48
 
47
49
 
48
50
 
49
- // CS8618 null 非許容の フィールド 'A' には、コンストラクターの終了時に null 以外の値が入っていなければなりません。
51
+ // CS8618 null 非許容の フィールド 'A' には、コンストラクターの終了時に null 以外の値が入っていなければなりません。フィールド を Null 許容として宣言することをご検討ください。
50
52
 
51
- public Hoge() => Init();
53
+ public Hoge() => InitB();
52
54
 
53
55
 
54
56
 
55
57
  [MemberNotNull(nameof(B))]
56
58
 
57
- private void Init() => B = new object();
59
+ private void InitB() => B = new object();
58
60
 
59
61
  }
60
62