Questions tagged «nullable-reference-types»

有关与C#8的可为空的引用类型有关的问题。

3
是什么 ?[]?C#中的语法?
虽然我正在研究委托其是实际上是一个抽象类中Delegate.cs,我看到了下面的方法中,我不明白 为什么返回值?已经使用了reference(class)类型,为什么要使用 ?[]? 参数含义 你能解释一下吗? public static Delegate? Combine(params Delegate?[]? delegates) { if (delegates == null || delegates.Length == 0) return null; Delegate? d = delegates[0]; for (int i = 1; i < delegates.Length; i++) d = Combine(d, delegates[i]); return d; }


2
无效是什么!声明是什么意思?
我最近看过以下代码: public class Person { //line 1 public string FirstName { get; } //line 2 public string LastName { get; } = null!; //assign null is possible public string? MiddleName {get; } = null; public Person(string firstName, string lastName, string middleName) { FirstName = firstName; LastName = lastName; MiddleName = …

4
为什么此代码会给出“可能的空引用返回”编译器警告?
考虑以下代码: using System; #nullable enable namespace Demo { public sealed class TestClass { public string Test() { bool isNull = _test == null; if (isNull) return ""; else return _test; // !!! } readonly string _test = ""; } } 当我建立这个时,标有 !!!会向编译器发出警告:warning CS8603: Possible null reference return.。 鉴于这一点,我觉得有些困惑 _test是只读的并且初始化为非null。 如果将代码更改为以下内容,警告将消失: …

3
对DTO使用可空引用类型的最佳实践
我有一个DTO,它是通过从DynamoDB表中读取来填充的。说当前看起来像这样: public class Item { public string Id { get; set; } // PK so technically cannot be null public string Name { get; set; } // validation to prevent nulls but this doesn't stop database hacks public string Description { get; set; } // can be null } 有什么最佳实践可以解决这个问题?我宁愿避免使用非参数构造函数,因为它与Dynamo …

2
如何在实体框架核心模型中使用C#8.0可空引用类型?
我在.NET Core 3.0项目上启用C#8.0可空引用类型。该项目使用Entity Framework Core 3.0访问数据库。 以下是标题不应为null的数据模型。 public class Vehicle { public int Id { get; private set; } public string Title { get; private set; } // Entity Framework Core is instructed to bind to the private _drivers field in a configuration builder private readonly List<Driver> _drivers = new …


2
我可以告诉C#可为空的引用方法实际上是对字段的空检查吗
考虑以下代码: #nullable enable class Foo { public string? Name { get; set; } public bool HasName => Name != null; public void NameToUpperCase() { if (HasName) { Name = Name.ToUpper(); } } } 在Name = Name.ToUpper()上,我收到一条警告,指出Name是可能的空引用,这显然是错误的。我可以通过内联HasName来解决此警告,因此条件是if(Name!= null)。 有什么方法可以指示编译器,HasName的真实响应暗含对Name的不可为空性的约束? 这很重要,因为HasName实际上可能会测试更多的东西,并且我可能想在多个地方使用它,或者它可能是API表面的公共部分。有很多原因希望将空检查纳入其自己的方法中,但是这样做似乎破坏了可空引用检查器。

1
什么是C#8中的未知可空性?
在C#8.0中,我们可以有可为空的引用类型。文档指出存在4种可为空性。前三个非常清楚,但我无法理解“未知”的含义。文档说它与泛型一起使用,但是当我尝试对泛型中T类型的无约束变量调用方法时,它只会发出警告,就好像该类型可以为空。我看不到unknown和nullable之间的区别。为什么未知存在?它如何表现出来?

5
C#8中的不可为空的引用类型在运行时可以为null吗?
在我看来,真的不能保证非空变量永远不会有null。想象一下,我有一个具有不为空的属性的类: public class Foo { public Foo(string test) { Test = test; } public string Test {get;set;} } 现在看起来好像现在不能为空。但是,如果我们用另一个不使用可为空的上下文的库引用该类,则没有什么可以阻止它在其中发送null的。 那是正确的还是有一些运行时检查也可以确保这一点?

1
未从FirstOrDefault公开的可空引用类型信息
我想测试C#8.0中新的可为空的引用类型功能。 我启动了一个针对.NET Core 3.0的新项目,在.csproj文件中启用了可为空的引用类型,并开始编码。我创建了一个简单的列表,该列表采用a string[]并string在等于的数组中返回abc。现在,由于不确定abc该数组中是否实际存在,因此我使用FirstOrDefault(),null如果未找到匹配项,则默认为。 using System; using System.Linq; public string FindArgument(string[] args) { var arg = args.FirstOrDefault(x => x == "abc"); return arg; } 我的方法的返回值string,这应该现在是非空的类型。由于FirstOrDefault()可能会返回null,因此我希望上述方法在返回may null arg变量时会产生警告。它不是。 查看FirstOrDefault()Visual Studio中的签名,很清楚为什么:该方法返回一个string,而不是string?我期望的可为空的等效项。 使用下面的方法主体确实会产生我期望的警告: var arg = args.Contains("abc") ? "abc" : null; return arg; System.Linq在面向.NET Core 3.0时,系统库(在此示例中)是否真的不公开可空性信息?

2
当似乎无法实现空引用时,为什么会收到可能的空引用空引用警告?
阅读了有关HNQ的问题之后,我继续阅读了有关C#8中的Nullable引用类型的信息,并进行了一些实验。 我非常清楚,有人说“我发现了编译器错误!”,十分之九,甚至更多。这实际上是设计使然,并对自己产生误解。而且,因为我直到今天才开始研究此功能,所以显然我对它没有很好的了解。这样处理后,让我们看下面的代码: #nullable enable class Program { static void Main() { var s = ""; var b = s == null; // If you comment this line out, the warning on the line below disappears var i = s.Length; // warning CS8602: Dereference of a possibly null reference } } …

3
将DTO类与ORM一起使用时,C#8中的可空引用类型
我在具有数据传输对象(DTO)类的项目中激活了此功能,如下所示: public class Connection { public string ServiceUrl { get; set; } public string? UserName { get; set; } public string? Password { get; set; } //... others } 但是我得到了错误: CS8618:不可空的属性'ServiceUrl'未初始化。考虑将属性声明为可为空。 这是DTO类,因此我没有初始化属性。这是初始化类以确保属性为非null的代码的职责。 例如,呼叫者可以执行以下操作: var connection = new Connection { ServiceUrl=some_value, //... } 我的问题:启用C#8的可空性上下文后,如何处理DTO类中的此类错误?

2
C#不能使`notnull`类型为可空
我正在尝试创建类似于Rust Result或Haskell的类型Either并且我已经了这一点: public struct Result<TResult, TError> where TResult : notnull where TError : notnull { private readonly OneOf<TResult, TError> Value; public Result(TResult result) => Value = result; public Result(TError error) => Value = error; public static implicit operator Result<TResult, TError>(TResult result) => new Result<TResult, TError>(result); public static implicit operator Result<TResult, …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.