Null 宽容运算符 (!) 在 C# >= 8.0 中不起作用
Null-forgiving operator (!) not working in C# >= 8.0
我尝试在 Unity 2020.3.1f1 中使用这个 null-forgiving 运算符 (!) vscode。 None 这些工具已经看到这种语法有效,所以我将它复制到这两个受文档启发的小提琴中:
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-forgiving
两者的代码相同:
using System;
public class Program
{
#nullable enable
public struct Person {
public string name;
}
static Person? GetPerson(bool yes) {
Person ret = new Person();
ret.name = "coucou";
if(yes) return ret;
else return null;
}
public static void Main()
{
Person? person = GetPerson(true);
if(person != null) Console.WriteLine("name: " + person!.name);
}
}
首先,C# 7.3 没有按预期工作:https://dotnetfiddle.net/HMS35M
其次是 C# 8.0,至少只是忽略了看起来的语法:https://dotnetfiddle.net/Mhbqhk
有没有让第二个工作的想法?
null-forgiving 运算符不适用于 Nullable<T>
- 唯一可用的相关成员仍然是 .Value
、.HasValue
和 .GetValueOrDefault()
;您将不得不使用稍长的 person.Value.name
/ person.GetValueOrDefault().name
,或者您可以在 if
测试期间捕获该值:
if (person is Person val) Console.WriteLine("name: " + val.name);
null-forgiving operator(Damn it) 运算符允许您通知编译器它应该忽略可能为 null 的引用,因为您拥有比编译器更多的信息。
First with C# 7.3 not workling as expected: https://dotnetfiddle.net/HMS35M
null-forgiving operator
直到 C# 8.0 才实现,您需要一个 nuget 包或一些替代的解决方法来启用爆炸符号在 C#7.3 的上下文中的使用。
Any idea to make this second one work?
当使用 Nullable<T>
struct
时,您可以使用 .Value
属性 来获取对象的值(实际的 Person
struct
你定义的)。如果没有 .Value
方法,编译器将不知道您是在尝试访问您定义的 Nullable<T>
对象还是 struct
对象。所以它无法在 Nullable<T>
对象上找到 .name
字段。
这应该适合你
if (person != null) Console.WriteLine("name: " + person!.Value.name);
我尝试在 Unity 2020.3.1f1 中使用这个 null-forgiving 运算符 (!) vscode。 None 这些工具已经看到这种语法有效,所以我将它复制到这两个受文档启发的小提琴中:
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/null-forgiving
两者的代码相同:
using System;
public class Program
{
#nullable enable
public struct Person {
public string name;
}
static Person? GetPerson(bool yes) {
Person ret = new Person();
ret.name = "coucou";
if(yes) return ret;
else return null;
}
public static void Main()
{
Person? person = GetPerson(true);
if(person != null) Console.WriteLine("name: " + person!.name);
}
}
首先,C# 7.3 没有按预期工作:https://dotnetfiddle.net/HMS35M
其次是 C# 8.0,至少只是忽略了看起来的语法:https://dotnetfiddle.net/Mhbqhk
有没有让第二个工作的想法?
null-forgiving 运算符不适用于 Nullable<T>
- 唯一可用的相关成员仍然是 .Value
、.HasValue
和 .GetValueOrDefault()
;您将不得不使用稍长的 person.Value.name
/ person.GetValueOrDefault().name
,或者您可以在 if
测试期间捕获该值:
if (person is Person val) Console.WriteLine("name: " + val.name);
null-forgiving operator(Damn it) 运算符允许您通知编译器它应该忽略可能为 null 的引用,因为您拥有比编译器更多的信息。
First with C# 7.3 not workling as expected: https://dotnetfiddle.net/HMS35M
null-forgiving operator
直到 C# 8.0 才实现,您需要一个 nuget 包或一些替代的解决方法来启用爆炸符号在 C#7.3 的上下文中的使用。
Any idea to make this second one work?
当使用 Nullable<T>
struct
时,您可以使用 .Value
属性 来获取对象的值(实际的 Person
struct
你定义的)。如果没有 .Value
方法,编译器将不知道您是在尝试访问您定义的 Nullable<T>
对象还是 struct
对象。所以它无法在 Nullable<T>
对象上找到 .name
字段。
这应该适合你
if (person != null) Console.WriteLine("name: " + person!.Value.name);