为什么显式声明的参考返回值会出现可空性警告?

Anatolii Humennyi

我为测试项目启用了可空性上下文,并尝试修复所有可空性警告。除了下面我不了解的那一部分(return ref book;在线),我能够解决所有这些问题我将警告粘贴在编译器生成的这一行的注释中:

class Program
{
    private Book[] books = { new Book("Call of the Wild, The", "Jack London"),
                    new Book("Tale of Two Cities, A", "Charles Dickens") };
    private Book? nobook = null;

    public ref Book? GetBookByTitle(string title)
    {
        for (int ctr = 0; ctr < books.Length; ctr++)
        {
            ref Book book = ref books[ctr];
            if (title == book.Title)
                return ref book; //CS8619: Nullability of reference types in value of type 'Book' doesn't match target type 'Book?'.
        }
        return ref nobook;
    }
}

public class Book
{
    public readonly string Title;
    public readonly string Author;

    public Book(string title, string author)
    {
        Title = title;
        Author = author;
    }
}

我不明白为什么编译器ref Book book对方法中作为nullable返回的non-nullable变量不满意ref Book?

据我所知,我们可以将不可为空的变量分配给可为空的变量,如下所示。如下面的代码所示,如​​果我Book bookBook?类型为的方法中返回non-ref变量,则编译器不会看到任何问题

    public Book? GetBookCopyByTitle(string title)
    {
        for (int ctr = 0; ctr < books.Length; ctr++)
        {
            ref Book book = ref books[ctr];
            if (title == book.Title)
                return book; //no warning here. The compiler is satisfied if we don't use ref return value
        }
        return null;
    }

为什么编译器在第一个代码段中产生此错误:

Nullability of reference types in value of type 'Book' doesn't match target type 'Book?'.

清扫器

发生错误是因为您在ref return这里使用

回顾ref returns的含义您正在将引用返回到变量,调用者可以使用引用来更改变量的值。

GetBookByTitle声明返回可为空的引用。根据声明,我可以从方法中获取引用,然后将其设置为null:

ref var book = ref GetBookByTitle("Tale of Two Cities, A");
book = null; // book is nullable, right? GetBookByTitle says it will return a nullable reference

因为我已经在通过特定的标题,book = null;将达到设定的非可空 books[1]null如果允许这样做,则会破坏可为空的引用类型带来的安全性,因此是不允许的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Java

括号内的返回值-为什么?

来自分类Java

为什么方法在声明之后总是返回true的情况下要求返回值?

来自分类Dev

为什么会出现“警告:返回对本地临时对象的引用”?

来自分类Javascript

为什么返回Promise时需要显式返回?

来自分类Dev

如果使用setter方法,为什么irb会回显赋值的右侧而不是返回值?

来自分类Dev

为什么必须显式声明嵌套类型?

来自分类Dev

为什么不调用带有const参考返回值的重载方法?

来自分类Dev

为什么必须在Fortran中隐式指定函数的双精度返回值?

来自分类Dev

为什么需要转发返回值

来自分类Dev

为什么会出现错误“标识符...已被声明”?

来自分类Dev

返回值优化:显式移动还是隐式?

来自分类Dev

为什么会出现“关联的参考不再显示”的信息?

来自分类Dev

可空性分析无法警告来自NameValueCollection的空值。为什么?

来自分类Dev

函数未显式返回值时会发生什么?无法弄清楚代码的输出如何

来自分类Dev

为什么必须将用于保存getchar返回值的变量声明为int?

来自分类Dev

函数不返回值,为什么?

来自分类Dev

为什么void返回值?

来自分类Dev

为什么查询不返回值

来自分类Dev

为什么我的返回值中出现逗号?JavaScript名人名称显示工具

来自分类Dev

尝试从数据库中回显值时,为什么会出现错误(通知:未定义的索引)?

来自分类Dev

我需要在C#上显式声明一个Dictionary以获取模拟返回值

来自分类Dev

为什么不返回值?

来自分类Dev

当DDL没有显式设置列时,列的可空性是什么?

来自分类Dev

将延迟加载的属性显式设置为null时,为什么会出现ObjectDisposedException?

来自分类Dev

如果设置 protobuf 可序列化类的值,为什么会出现 zmq 错误?

来自分类Dev

为什么会出现“警告:文件(...):无法打开流”错误?

来自分类Dev

为什么这里会出现“隐式任何返回类型”错误?

来自分类Dev

为什么在尝试从模拟返回值时会出现编译时错误?

来自分类Dev

为什么使用gets()函数的返回值会出现分段错误?

Related 相关文章

  1. 1

    括号内的返回值-为什么?

  2. 2

    为什么方法在声明之后总是返回true的情况下要求返回值?

  3. 3

    为什么会出现“警告:返回对本地临时对象的引用”?

  4. 4

    为什么返回Promise时需要显式返回?

  5. 5

    如果使用setter方法,为什么irb会回显赋值的右侧而不是返回值?

  6. 6

    为什么必须显式声明嵌套类型?

  7. 7

    为什么不调用带有const参考返回值的重载方法?

  8. 8

    为什么必须在Fortran中隐式指定函数的双精度返回值?

  9. 9

    为什么需要转发返回值

  10. 10

    为什么会出现错误“标识符...已被声明”?

  11. 11

    返回值优化:显式移动还是隐式?

  12. 12

    为什么会出现“关联的参考不再显示”的信息?

  13. 13

    可空性分析无法警告来自NameValueCollection的空值。为什么?

  14. 14

    函数未显式返回值时会发生什么?无法弄清楚代码的输出如何

  15. 15

    为什么必须将用于保存getchar返回值的变量声明为int?

  16. 16

    函数不返回值,为什么?

  17. 17

    为什么void返回值?

  18. 18

    为什么查询不返回值

  19. 19

    为什么我的返回值中出现逗号?JavaScript名人名称显示工具

  20. 20

    尝试从数据库中回显值时,为什么会出现错误(通知:未定义的索引)?

  21. 21

    我需要在C#上显式声明一个Dictionary以获取模拟返回值

  22. 22

    为什么不返回值?

  23. 23

    当DDL没有显式设置列时,列的可空性是什么?

  24. 24

    将延迟加载的属性显式设置为null时,为什么会出现ObjectDisposedException?

  25. 25

    如果设置 protobuf 可序列化类的值,为什么会出现 zmq 错误?

  26. 26

    为什么会出现“警告:文件(...):无法打开流”错误?

  27. 27

    为什么这里会出现“隐式任何返回类型”错误?

  28. 28

    为什么在尝试从模拟返回值时会出现编译时错误?

  29. 29

    为什么使用gets()函数的返回值会出现分段错误?

热门标签

归档