以下に示すように、データ転送オブジェクト(DTO)クラスを持つプロジェクトでこの機能をアクティブにしました。
public class Connection
{
public string ServiceUrl { get; set; }
public string? UserName { get; set; }
public string? Password { get; set; }
//... others
}
しかし、私はエラーを受け取ります:
CS8618
:null可能ではないプロパティ 'ServiceUrl'は初期化されていません。プロパティをnull許容として宣言することを検討してください。
これはDTOクラスなので、プロパティを初期化していません。これは、プロパティがnullでないことを保証するためにクラスを初期化するコードの責任です。
たとえば、呼び出し元は次のことができます。
var connection = new Connection
{
ServiceUrl=some_value,
//...
}
私の質問:C#8のnull可能性コンテキストが有効になっているときに、DTOクラスでこのようなエラーを処理する方法は?
3
示されている方法で構築の初期化を行うと、デフォルトのコンストラクターが実行されます(ServiceUrlをデフォルト値(文字列の場合はnull)に初期化します)。次に、initializeステートメントが実行されます。null不可にしたい場合は、初期化されたすべてのコンストラクターを終了する必要があります
—
Flydog57
POCOは、コンストラクターがないことや、プロパティが初期化されていないことを意味しません。という意味
—
Panagiotis Kanavos
Plain Old C# Object
です。特別なクラスから継承することなく、他のオブジェクトと同様のオブジェクト。別の質問があると思います。DTOの作成方法Data Transfer Objects
This should be the responsibility of the one initializing the class to ensure that the properties are non-null
クラスは常に有効な状態でなければなりません。null
が許可されていない場合、プロパティをnullにすることはできません。おそらく、基本的な文字列の代わりに、None
F#のOptionクラスのように、or`Missing`の値を持つことができるURLの特殊なクラスを使用する必要があります。C#8を使用すると、そのようなクラスを記述して、パターンマッチングでチェックすることができます
@Panagiotis Kanavos、私の場合、クラスにはパラメーターのないコンストラクターであるという制約があります。したがって、プロパティ初期化子を使用する必要があります
—
M.Hassan
public string ServiceUrl { get; set; } = default! ;
。Roslynがctorのスコープ外で遅延初期化を処理する方法を将来的に持っていることを願っています。私はMayBe <T>(Optionクラスと同様)を使用していましたが、新しいコードのためにc#8でnull可能な参照型に切り替えました。
NRTはMaybesではありません。実際、Maybesはさらに重要で使いやすくなりました。もちろん、それらはパターンマッチングでの作業を容易にするC#イディオムを使用してビルドされています
—
Panagiotis Kanavos