C# - トラブルシュート - CS8600 CS8603 Null

 クラウディア
1. 概要
2. 状況
3. CS8600
4. CS8603

1. 概要

 これは。 ・Microsoft Visual Studio Community 2022 (64 ビット) - Version 17.12.1 ・Microsoft .NET Framework Version 4.8.09032 ・C# ツール 4.12.0-3.24558.5+21192bfc323cbdd5a1f6e5dadca56ef0558c8adf  で発生した現象です。  以前、「Visual Studio 2010」あたりのときには、同じコードで発生しなかった「warning」なのです。  本ページは、下記のサイトを参考にさせていただきました。
= (null 非厳格) 演算子 - C# reference」
「【C#】null免除演算子(ビックリマーク)で警告を無視する #C#

2. 状況

 下記のソースで・・・。

	[Serializable]
	public class ObjectCopy
	{
		public object Clone()
		{
			object objCopy = new object();
			MemoryStream ms = new MemoryStream();
			XmlSerializer xml = new XmlSerializer(this.GetType());
			xml.Serialize(ms, this);
			ms.Position = 0;
			objCopy = xml.Deserialize(ms);
			ms.Close();
			return objCopy;
		}
	}
 下記の「warning」が出力されます。

.cs(23,14,23,33): warning CS8600: Null リテラルまたは Null の可能性がある値を Null 非許容型に変換しています。
.cs(25,11,25,18): warning CS8603: Null 参照戻り値である可能性があります。

3. CS8600


.cs(23,14,23,33): warning CS8600: Null リテラルまたは Null の可能性がある値を Null 非許容型に変換しています。
 は。

	objCopy = xml.Deserialize(ms);
 で発生しています。  「xml.Deserialize(ms)」の戻り値が、「「null」かもしれんけどいいの?」てな話のようです。  「いいよ」とするには。

	objCopy = xml.Deserialize(ms)!;
 と書きます。  引数の後に、「!」を書くわけです。  式の前の接頭辞「!」は、否定「Not」の意味を持ちますが。  式の後の接尾辞「!」は、「null」を許容するという意味だそうです。  これ、厳密には、単に「CS8600」の警告を抑制するだけのようなので、他の方法で、「null」を避ける方法があれば、それを使う方がよいかと思います。

4. CS8603

 実は、前項の対処で、「CS8603」も消えちゃうのですが。

.cs(25,11,25,18): warning CS8603: Null 参照戻り値である可能性があります。
 は。

			return objCopy;
 の箇所で発生しています。  メソッドの定義が。

		public object Clone()
 なのに、「『null』を返しちゃうかもしれませんぞ」と言っておるのです。  ここだけ、消すには。

		public object? Clone()
 式の後に「?」を書くのは、「Null 許容参照型」と言うようです。  「この型は、『nullable』ですぜ」ということですな。  これちょっと「PHP」のプリフィックス「?」と似ています。  「C#」の場合は、サフィックスになっておるのが違っているところ。
AbemaTV 無料体験