gpt4 book ai didi

c# - 为什么 C# 编译器无法检测到 this 不能为 null?

转载 作者:行者123 更新时间:2023-12-02 18:00:45 24 4
gpt4 key购买 nike

Safe 扩展方法永远不会返回 null,但编译器似乎无法检测到这一点。我想我读过一些关于这是字符串的有意设计决策的内容,但不记得何时何地。谁能解释如何解决这个问题(即帮助编译器)或解释为什么故意这样做?

Foo? foo = null;
Bar bar = new();

// CS8601: Possible null reference assignment.
bar.NoNullsHere = foo?.Text().Safe();

// No error with the trailing exclamation point
bar.NoNullsHere = foo?.Text().Safe()!;

public static class StringExtensionMethods
{
public static string Safe(this string? obj) => obj is null ? string.Empty : obj!;
}

public class Foo
{
public string? Text() => "has a value, but could be null or empty";
}

public class Bar
{
public string NoNullsHere { get; set; } = string.Empty;
}

编辑:@sweeper 提供的“正确关联”答案是正确的 - Safe 方法不会被调用。鉴于此,是否有可能实现我想要完成的目标?我真的更喜欢语法和智能感知支持。此外,我的实际实现接受 Safe 方法的其他参数,以选择性地执行诸如用一些标记(例如双引号)包围结果字符串之类的操作。

bar.NoNullsHere = foo?.Text().Safe();

而不是其中任何一个

bar.NoNullsHere = StringExtensionMethods.Safe(foo?.Text());
bar.NoNullsHere = foo?.Text() ?? string.Empty;

编辑 2:忘记提及 @sweeper 确实提供了解决方法。必需的括号有点烦人,但比其他选择要好。谢谢大家!

bar.NoNullsHere = (foo?.Text()).Safe();

最佳答案

?. 使一切都变得“右关联”(抱歉我找不到更好的词)。

foo?.Text().Safe();

表示“如果 foo 不为空,则运行 Text().Safe()”。因此,如果 foo null,它将不执行任何操作并计算为 null。如果有帮助,请将其视为:

// not valid syntax, but IMO a good mental image
foo?.(Text().Safe());

这种行为也是您能够在链中仅使用一个 ? 的原因:

someNullableThing?.Property1.Property2.Property3

如果 ?. 是“左关联”,则 someNullableThing?.Property1 将为空,并且您必须在任何地方放置 ?即使 PropertyN 不可为空。请注意,像 Kotlin 这样的一些语言实际上是这样实现的。

也就是说,我认为你的意思是:

bar.NoNullsHere = (foo?.Text()).Safe();

即使 foo 为 null,这也会运行 foo.Safe()

关于c# - 为什么 C# 编译器无法检测到 this 不能为 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74510269/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com