- 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#」の場合は、サフィックスになっておるのが違っているところ。
|