C# 8 在返回具有可为空约束的可为空泛型时发出警告

2023-12-22

这段代码:

public T Foo<T>()
    where T : class?
{
    return null;
}

给出以下错误:

当“T”不可为空时,空文字会引入空值 参考类型

我不明白为什么当我们说 T 可以为空时我们不能返回 null。如果我们另外尝试返回T?我们会得到一个错误T必须是不可空的。

似乎不可能同时拥有可为空约束并返回可为空结果。


想象一下你打电话:

string result = Foo<string>();

result现在包含null。但这是一个string,它不可为空。

编译器警告你Foo<T>可以在哪里调用T不可为空,并且返回null在这种情况下会出乎意料。

注意where T : class?意思是T may可以为空,但也可能不是。两个都string and string?被允许。我不相信有什么办法可以说“T must可以为空”。


如果你想说:

  1. T允许为空
  2. When T不可为空,那么该类型仍然可以返回null

然后你可以写:

[return: MaybeNull]
public T Foo<T>()
    where T : class?
{
    return null!;
}

SharpLab https://sharplab.io/#v2:C4LgbgpgTglgZgTwD4AEBMBGAsAKBQBgAIUMA6AERgEMBzAOwHsBnYGAYydIGEGATCAIJ0qAGwRMYTANy4AxHQCuIkVQBGIiIQjD1EXCgDMxNIS6EA3rkLXiRgCoB+QgDEGDADx2AfAAoAlFY2QQDuABbQmnaEIMaB1pY4QUEoAOyEisoyiTYAvnGE+YbEACyEALL++QlJNiREUBBMSsCEALwubu51vn5ZQXk4OUA===

注意MaybeNull只适用于方法的契约而不是其主体,这就是为什么我们需要返回的原因null!。但是您可以在上面的 SharpLab 链接中看到调用者string result = Foo<string>();得到正确的警告。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 8 在返回具有可为空约束的可为空泛型时发出警告 的相关文章

随机推荐

  • 为什么 /}/ 是 JavaScript 中有效的正则表达式?

    是 JS 中有效的正则表达式 alert replace g 然而 ECMA标准 http es5 github com x15 10 1似乎不允许 PatternCharacter SourceCharacter but not any
  • 输入表单字段的 ActiveAdmin 自定义值

    我在 Rails 4 中有一个 ActiveAdmin 项目 出于某种原因 当我使用 value gt some value对于一个字段来说 没有任何改变 它仅显示为空文本字段 这是我的表格的示例 form do f f inputs Te
  • Objective-C - 如何提高浮点数的精度

    有人可以告诉我如何将浮点数的精度设置为所需的长度吗 假设我有一个号码 2504 6 正如你所看到的 这里的精度只有 1 我想将其设置为 6 我需要这个 因为我将此值与从 txtInput text floatValue 即使我在文本框中输入
  • 如何使用正则表达式在Matlab中解析HTML标签?

    我时间紧迫 特别想提取如下所示的字符串 问题是标签不是以下形式 a data a Given s em style font size 6 5 888 em 如何在matlab中提取出5 888 你会发现有用的信息here https st
  • Unicode小写字符?

    我在某个地方读到 有字符other比 Unicode 中具有小写等效项的 A Z 更重要 这些可能是什么 为什么其他字符需要大写和小写 英语 甚至是那种奇怪的变体 美式英语 并不是地球上唯一的语言 有一些very看起来很奇怪 至少对于那些熟
  • 在隐藏的 HTML 输入字段中使用方括号

    我正在分析别人的 PHP 代码 我注意到输入 HTML 有许多隐藏的输入字段 其名称以 结尾 例如
  • 下面的表达式在 python 中如何工作? [复制]

    这个问题在这里已经有答案了 下面的表达式在 python 中如何工作 gt gt gt 1 1 2 gt gt gt 1 1 0 我认为这会引起SyntaxError但事实并非如此 您必须使用括号逻辑和算术运算来进行这种计算 1 2 变为
  • Rails Upsert PG created_at 问题

    抱歉 如果之前已经回答过这个问题 但我找不到明确的答案 肯定有人在使用的时候遇到过这个问题upsert您需要指定每一列 包括created at and updated at 怎么才能不更新created at更新插入发生时的时间戳 我只想
  • 检查 google reCaptcha 服务是否打开或关闭

    我正在使用简单的谷歌验证码 我的要求是 如果谷歌API不可用 即如果谷歌服务器关闭 知道它不常见的情况 意味着没有从谷歌服务器得到任何回复 那么在加载表单时我将隐藏谷歌reCaptcha包装器并在提交表单时我不想验证谷歌验证码 请建议我怎样
  • 在Python中仅检索网页的标题

    我有 5000 多个网页 我想要所有这些网页的标题 在我的项目中 我使用这样的 BeautifulSoup html 解析器 soup BeautifulSoup open url read soup title 0 string 但它需要
  • 不同 JBoss 版本上的 EJB2

    我需要使用部署在 JBoss 版本 4 x 上的一些 EJB 以及部署在 JBoss 版本 3 2 x 上的另一个 EJB 这可能吗 我问这个问题是因为我有一个第三方应用程序 它使用一些奇怪的桥来做到这一点 但不知道为什么 尽管我没有尝试自
  • 多重性和 EF 6 的问题

    这件事不知从何而来 我以前从未遇到过这个问题 我刚刚完成向 SQL Azure 数据库添加一个表 该表将为注册我们的电子邮件列表的人员保存电子邮件 该表没有任何关联 它只是单独的 我返回 VS 并从数据库更新我的模型 现在收到这些错误 Er
  • Objective c - 通过 http POST 发送图像

    我试图了解如何使用 http POST 和我当前的客户端 服务器协议设计发送图像 从客户端到服务器的所有消息如下例所示 有一个带有参数的cmd字符串cmd以及该命令的一些更相关的参数 例如 这是我向服务器发送短信的方式 void sendM
  • YouTube Android API:YouTubePlayerFragment 加载微调器

    我正在使用 Android YouTube API 示例在我的应用程序中创建一个 chromeless YouTube 播放器 我遇到的问题是 即使视频已加载并开始播放 缓冲 加载进度条仍会继续显示在视频上 我可以在FragmentDemo
  • 400 找不到项目的计费帐户。必须启用计费才能激活服务

    我通过 firebase 创建 API这个教程在这里 https itnext io building a serverless restful api with cloud functions firestore and express
  • 如何通过在Spring data jpa中连接来自不同数据库的2个表来运行本机查询?

    我正在使用 Spring boot 1 5 18 RELEASE 我使用以下方法跟踪了多个数据源link https www baeldung com spring data jpa multiple databases 但当我在同一服务器
  • 使用 Spring Android RestTemplate 发送 Gzip 压缩数据?

    目前的Spring Android 文档 http docs spring io spring android docs current reference htmlsingle d4e52第 2 2 2 节中说 RestTemplate
  • C# 中的 const 函数参数 [重复]

    这个问题在这里已经有答案了 可能的重复 C 的只读 类似 const 函数参数 https stackoverflow com questions 3826542 read only const like function paramete
  • 根据打字稿中的构造函数参数重载类属性

    在我们的代码库中 我们广泛使用导航器和构建器模式来抽象组装分层对象 这的核心是一个Navigator我们用它来遍历不同的类 我目前正在尝试将其迁移到打字稿 但正在努力输入它以利用打字稿的力量 我认为我的问题的核心是我无法使用this作为类上
  • C# 8 在返回具有可为空约束的可为空泛型时发出警告

    这段代码 public T Foo