我有:
public abstract class Craft
{
public Craft()
{
CurrentQuadrant = new Point(0, 0);
}
private Point _currentQuadrant;
public Point CurrentQuadrant
{
get => _currentQuadrant;
set
{
_currentQuadrant = value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
(点是一个简单的 xy 对)。
为什么会给我这样的警告Non-nullable field '_currentQuadrant' must contain a non-null value when exiting the constructor?赋值是否不能确保它不为空?
我看到了很多有关此错误的问题,但所有/大多数都包含复杂的代码或类型。
我使用这一行很多年了,提示方法名称时出错:
string currentMethod = System.Reflection.MethodBase.GetCurrentMethod().Name;
Run Code Online (Sandbox Code Playgroud)
但现在我得到这个错误:
警告 CS8602:取消引用可能为空的引用。
我应该更改什么/是否有另一种方法可以获取当前方法的名称而不出现此错误?
谢谢
我正在使用 EF Core,并且我有这个模型:
public class Article
{
public int Id { get; set; }
public User Author { get; set; } // <- CS8618
public int AuthorId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
正如上面的代码注释中所指出的,我收到一个恼人的可为空警告。我正在使用 Fluent API 来注释我的模型,显然 Author 不可为空,因为 AuthorId 不可为空。
我觉得使用User? Author相反 来使警告消失是不正确的,因为该属性显然不可为空,这将是一个谎言,并且也向使用我的模型的人暗示它可以为空。
处理这种情况的正确方法是什么?抑制警告?
具有设置支持字段的必需 init 属性仍然会给出空警告。
下面的代码给出了一个警告:
警告 CS8618 退出构造函数时,不可空字段“_name”必须包含非空值。考虑将该字段声明为可为空。
public class TestRequiredInit
{
private readonly string _name;
public required string Name
{
get => _name;
init => _name = value;
}
}
Run Code Online (Sandbox Code Playgroud)
我没有看到一种TestRequiredInit在不_name设置为非空值的情况下创建的方法。

这是 MSBuild / VS 中的错误,还是我遗漏了什么?
为了提出问题,我对上面的代码进行了一些简化。我希望能够向属性初始值设定项添加初始化逻辑。
public class TestRequiredInit
{
private readonly string _name;
public required string Name
{
get => _name;
init
{
if (value.Length > 50)
{
throw new ArgumentException();
}
_name = value;
}
}
}
Run Code Online (Sandbox Code Playgroud) 我尝试创建具有一定数量的非空属性(> 7)的类。
如果我这样做:
public class Meeting
{
public Name Name { get; set; }
public Person ResponsiblePerson { get; set; }
public Description Description {get; set; }
public Category Category { get; set; }
public Type Type { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public List<Person> Attendees { get; set; }
public Meeting()
{
Attendees = new List<Person>();
}
}
Run Code Online (Sandbox Code Playgroud)
我收到这样的警告: “退出构造函数时,不可为空的属性 '...' 必须包含非空值。请考虑将该属性声明为可空。”
我想到了一个变体列表:
默认值删除了这个警告,但我认为,它只会添加无用的值,将来无论如何都需要更改。
如果我初始化构造函数中的所有属性,此警告就会消失,但构造函数将具有 >7 个参数,这将是一场噩梦。 …