【发布时间】:2019-11-30 16:52:51
【问题描述】:
我在具有数据传输对象 (DTO) 类的项目中激活了此功能,如下所示:
public class Connection
{
public string ServiceUrl { get; set; }
public string? UserName { get; set; }
public string? Password { get; set; }
//... others
}
但我得到了错误:
CS8618:不可为空的属性“ServiceUrl”未初始化。考虑将属性声明为可为空。
这是一个 DTO 类,所以我没有初始化属性。这将是初始化类以确保属性不为空的代码的责任。
例如,调用者可以这样做:
var connection = new Connection
{
ServiceUrl=some_value,
//...
}
我的问题:启用 C#8 的可空性上下文时如何处理 DTO 类中的此类错误?
【问题讨论】:
-
当您按照您显示的方式进行构造初始化时,默认构造函数会运行(将 ServiceUrl 初始化为其默认值(对于字符串来说,它是 null))。然后,初始化语句运行。如果您希望它不可为空,则需要退出所有已初始化的构造函数
-
POCO 并不意味着它没有构造函数或属性未初始化。这意味着
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,则该属性从不为空。也许,您应该为 URL 使用专门的类而不是基本字符串,该类的值可以是None或`Missing`,例如 F# 中的 Option 类。 C# 8 允许您编写此类类并使用模式匹配检查它们 -
@Panagiotis Kanavos,在我的例子中,这个类有一个约束是无参数构造函数。所以我必须使用属性初始化器:
public string ServiceUrl { get; set; } = default! ;。我希望 Roslyn 将来可能有一种方法来处理 ctor 范围之外的后期初始化。我使用的是 MayBe(如 Option 类),但我在 c#8 中为新代码切换到可为空的引用类型。 -
NRT 不再是 Maybes,事实上,Maybes 现在更更重要且更易于使用。当然,前提是它们是使用 C# 习惯用法构建的,使它们易于使用模式匹配
标签: c# orm dto c#-8.0 nullable-reference-types