teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

見直しキャンペーン中

2023/07/26 15:38

投稿

TN8001
TN8001

スコア10111

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

2

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

2021/04/06 01:30

投稿

TN8001
TN8001

スコア10111

answer CHANGED
@@ -29,4 +29,19 @@
29
29
  [MemberNotNull(nameof(B))]
30
30
  private void InitB() => B = new object();
31
31
  }
32
- ```
32
+ ```
33
+
34
+ ---
35
+
36
+ 通じていない気がするので追記
37
+
38
+ > 毎回!マークを付けるのではなくAをobject?型ではなくobject型として扱いたいです
39
+ > 少し前までNotNullAttributeを付けておこえば、上記を実現出来たのですが、この方法はバグだったのかVSを最新にするとワーニングが出るようになってしまいました。
40
+
41
+ `xxx`のところで「毎回bang(`!`)を付けるのが面倒だ」という話だと思っていたのですが、違うんでしょうか?
42
+
43
+ `A`に警告が出るのは、ほかの方も指摘されているとおりです。
44
+
45
+ しかし`xxx`に警告が出るのは全く別の話です。
46
+ `Object`では`public virtual string? ToString()`となっています。
47
+ ![イメージ説明](92b9701afb0357200979e2bde92bdeb4.png)

1

警告間違い

2021/04/06 01:30

投稿

TN8001
TN8001

スコア10111

answer CHANGED
@@ -6,15 +6,16 @@
6
6
 
7
7
  public class Hoge
8
8
  {
9
- // CS8618 null 非許容の フィールド 'A' には、コンストラクターの終了時に null 以外の値が入っていなければなりません。
10
9
  [NotNull] private object? A;
11
10
 
11
+ public void Init() => A = new object();
12
+
12
13
  public void Method()
13
14
  {
14
15
  // CS8600 Null リテラルまたは Null の可能性がある値を Null 非許容型に変換しています。
15
16
  string xxx = A.ToString();
16
17
 
17
- // 何も出ません
18
+ // 警告は出ません
18
19
  string yyy = A.ToString() ?? "Null!";
19
20
  }
20
21
 
@@ -22,10 +23,10 @@
22
23
  // 蛇足
23
24
  private object B;
24
25
 
25
- // CS8618 null 非許容の フィールド 'A' には、コンストラクターの終了時に null 以外の値が入っていなければなりません。
26
+ // CS8618 null 非許容の フィールド 'A' には、コンストラクターの終了時に null 以外の値が入っていなければなりません。フィールド を Null 許容として宣言することをご検討ください。
26
- public Hoge() => Init();
27
+ public Hoge() => InitB();
27
28
 
28
29
  [MemberNotNull(nameof(B))]
29
- private void Init() => B = new object();
30
+ private void InitB() => B = new object();
30
31
  }
31
32
  ```