1. 概要
「Visual Studio 2022」「.NET 8」では、「Null」の可能性や、「Nullable」であるかどうかのチェックが、厳しくなっています。
「CS86xx」は、たいていこの手の警告になります。
2. CS8600
下記のようなメッセージが表示されます。
Null リテラルまたは Null の可能性がある値を Null 非許容型に変換しています。
「C#」のこのような文で出力されます。
string name = null;
これは、「C#」での「Null」チェックが厳しくなったために出力されるようになりました。
下記のように書き換えます。
string? name = null;
型名の後ろに「?」をつけることで、この変数が「Nullable」である旨を定義してやれば、解消します。
3. CS8601
下記のようなメッセージが表示されます。
Null 参照代入の可能性があります。
「Null」の可能性のある参照型の代入値が、「Non-nullable」な変数に代入されるときに、表示されます。
例えば、下記のような構文。
className.menberValue = cmb.SelectedItem.ToString();
上記のような場合は、まず、代入先を「Nullable」にするのと。
public string ? menberValue { get; set; }
代入時の構文を以下のように変更します。
className.menberValue = cmb.SelectedItem?.ToString();
4. CS8602
下記のようなメッセージが表示されます。
null 参照の可能性があるものの逆参照です。
下記のような構文で、発生します。
e = v.GetObject();
classA tmp = e.somValue;
上記の場合、「e」が「Null」である可能性があるために、この警告になります。
下記のように、「Null」チェックを行ったうえで、実行文を記述するようにします。
e = v.GetObject();
if (e != null)
{
classA tmp = e.somValue;
}
あるいは、このような構文で発生する場合。
var result = s.Length;
上記で、「s」が非「Null」であることがわかっているならば、下記のような書き方もできます。
var result = s!.Length;
5. CS8603
下記のようなメッセージが表示されます。
Null 参照戻り値である可能性があります。
下記のようなメソッドで、発生します。
public string somMethod(IEnumerable source)
{
return source.some();
}
この場合。
public string? somMethod(IEnumerable source)
{
return source.some();
}
と戻り値が、「Nullable」であることにすれば、この箇所は、解消しますが、このメソッドを呼び出している箇所が、芋づる式に警告になる恐れがあります。
芋づる式を避けたい場合、下記のような書き方もあります。
public string somMethod(IEnumerable source)
{
return new string(source.some());
}
6. CS8604
下記のようなメッセージが表示されます。
'type? class.Method(string name)' 内のパラメーター 'name' に Null 参照引数がある可能性があります。
これは、「C#」での「Null」チェックが厳しくなったために出力されるようになりました。
public type? Method(string name)
てなメソッドをコールしている、下記のような箇所に表示されます。
type? someValue = class.Method(someName);
これは、メソッド側の定義で。
public type? Method(string? name)
と、引数を宣言している、箇所の型名の後ろに「?」をつけることで、この引数が「Nullable」である旨を定義してやれば、解消します。
7. CS8605
下記のようなメッセージが表示されます。
null の可能性がある値をボックス化解除しています。
下記のような構文で、発生します。
ObjectId a = (ObjectId)cmb.SelectedValue;
下記のように記述することで解消します。
ObjectId a = new ObjectId();
if (cmb.SelectedValue != null)
{
a = (ObjectId)cmb.SelectedValue;
}
8. CS8616
下記のようなメッセージが表示されます。
null 非許容の プロパティ 'Name' には、コンストラクターの終了時に null 以外の値が入っていなければなりません。'required' 修飾子を追加するか、プロパティ を Null 許容として宣言することを検討してください。
下記のような、クラス宣言をしているときに、「public string Name」の行で発生します。
public class classA
{
public string Name { get; set; }
public double Value { get; set; }
}
解消するには。
public string? Name { get; set; }
のように「Nullable」な型として、定義するか。
public string Name { get; set; } = string.Empty;
のように、「Null」以外の初期値を設定します。
9. CS8625
下記のようなメッセージが表示されます。
null リテラルを null 非許容参照型に変換できません。
下記のような構文で発生します。
public bool sumeMethod(out string text)
{
text = null;
...
}
これは、変数を「Nullable」にするか。
public bool sumeMethod(out string? text)
「null」以外の適切な初期値で初期化します。
text = string.Empty;
10. CS8629
下記のようなメッセージが表示されます。
Null 許容値型は Null になる場合があります。
下記のような構文で発生します。
double d = someMethod(a.Value);
これは、下記のように書き換えることで、解消します。
double d = someMethod(a!.Value);
11. 参考サイト
本ページは、「Google」大先生を参考にさせていただきました。