在 C# 4.0 中,为什么方法中的输出参数不能是协变的?

2024-03-30

鉴于这个神奇的界面:

public interface IHat<out TRabbit>
{
    TRabbit Take();
}

这个类的层次结构:

public class Rabbit { }

public class WhiteRabbit : Rabbit { }

我现在可以编译这个:

IHat<WhiteRabbit> hat1 = null;
IHat<Rabbit> hat2 = hat1;

这太棒了。但是如果我以不同的方式定义接口怎么办:

public interface IHat<out TRabbit>
{
    bool Take(out TRabbit r);
}

我使用单独的布尔返回值来表明帽子可能是空的(以前的版本可能会从空帽子返回空兔子)。但我仍然只输出一只兔子,所以没有做任何与之前版本逻辑上不同的事情。

CTP 中的 C# 4.0 编译器在接口定义中给出错误 - 它要求“out”方法参数为不变类型。是否存在不允许这样做的明确原因,或者是否可能在未来版本中解决?


有趣的。然而,在 CLI 级别,没有“out”这样的东西——只有“ref”;有一个属性可以帮助编译器(用于明确的赋值),它表示“您不需要将其传递”。

也许这个限制是因为 CLI 没有“out”,只有“ref”。

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

在 C# 4.0 中,为什么方法中的输出参数不能是协变的? 的相关文章

随机推荐

  • QWebEngineView 在 Windows 10 上不显示任何内容

    我创建了一个可以在 Mac 上完美运行的 Python 应用程序 但我需要能够在 Windows 上运行它 到目前为止 我坚持我的QWebEngineView不显示任何东西 我创建了一小段代码来测试 但到目前为止 它在 Win10 上只显示
  • 我可以使用什么架构来处理每个产品都需要保存不同属性的购物车

    我正在构建一个与购物车非常相似的应用程序 用户从列表中选择一个产品 然后根据该产品 需要设置并保存一些属性 Example 如果用户选择允许自定义颜色匹配的油漆类型 那么我必须允许他们输入通过颜色匹配过程收到的公式编号 因此 我有一个属于
  • Android Studio 在创建新图像资源时不加载图像

    我正在尝试向 android studio 添加新的图像资源 并且已按照几个步骤正确添加它们 但 IDE 未加载图像 我已经关注了这些steps https i stack imgur com uJCIG gif 这是我的result ht
  • 无法将对象发送到 SOAP Web 服务

    我有一个肥皂网络服务 方法如下 string startReaction object reaction 在该方法中 我将此对象转换为其真实类型 Reaction reactionObj Reaction reaction 我有同样的Rea
  • Docker 与子目录组合并实时重新加载

    我使用创建了一个应用程序创建反应应用程序 https github com facebookincubator create react app并设置 docker compose 以设置容器并启动应用程序 当应用程序位于根目录时 应用程序
  • 正则表达式密码验证,OR 运算

    我需要使用以下规则验证密码 7 个字符 必须包含至少一个字母 必须包含至少一个数字或特殊字符 下面的正则表达式遵循 AND 操作 a z 0 9 7 这里如何执行第三条规则中的 OR 运算 我认为这个正则表达式会起作用 a z 0 9 7
  • Haxe + Webpack 导出空对象

    我正在尝试在 Haxe 编译器导出的 JS 上运行 webpack dev server 我正在使用 hxgenjs 库将 haxe 输出拆分为单独的模块 并尝试通过 webpack 合并它们 以使用热模块替换功能 一切似乎都正常 但输出是
  • Rails/Devise - 如何显示注册信息(不仅仅是编辑它)

    我今天安装了 Devise 到目前为止一切正常 devise 似乎唯一没有提供的是 registration show 操作 它显示用户信息 而不是注册编辑页面 我尝试覆盖注册控制器 但收到错误 未知操作 AbstractControlle
  • 将组总计添加到 Pandas 数据框中的最佳方法

    我有一个简单的任务 我想知道是否有更好 更有效的方法来完成 我有一个如下所示的数据框 Group Score Count 0 A 5 100 1 A 1 50 2 A 3 5 3 B 1 40 4 B 2 20 5 B 1 60 我想添加一
  • 从 PyPi 下载轮子

    如何从列出的软件包中下载特定的车轮PyPi https pypi python org pypi 我假设我会使用wget or curl 但我不确定要使用哪些参数 众所周知 PyPI 很难内省 幸运的是 Debian 项目用于扫描 FTP
  • 找出函数属于哪个模块

    在 ghci haskell 中 有一个命令可以告诉我函数属于哪个模块 在加载的模块中 例如如果该函数被称为whichMod 那么它将按如下方式工作 Prelude gt whichMod take Prelude Prelude gt w
  • 如何在 flutter 中使用进度指示器?

    我是颤振新手 想知道什么是更好的添加方法CircularProgressIndicator在我的布局中 例如 我的登录视图 该视图有用户名 密码和登录按钮 我确实想创建一个覆盖布局 用Opacity 在加载时 显示进度指示器 就像我在 Na
  • CDI 注入 POJO 何时应该起作用? (玻璃鱼 v3)

    当我将 EJB 3 1 beans 注入到 Inject 创建的 POJO 中时 注入就会起作用 当我自己构建 POJO 时 它不会 Glassfish v3 这是正确的行为吗 我的类 在 EJB 模块中 Singleton LocalBe
  • 为什么 Django 在测试期间不创建空白数据库?

    当我运行单元测试时 Django 1 6 似乎没有创建一个空白数据库来进行测试 我不明白为什么 姜戈docs http django readthedocs org en 1 6 topics testing overview html t
  • 在没有 UIWebView 的情况下播放 YouTube 链接的视频

    我想在我的应用程序中播放来自 YouTube 链接的视频 例如 http www youtube com watch v Uner 3tTY1I 但我不想将用户重定向到应用程序中的任何网络视图 只是想在我的应用程序的当前视图中的视频播放器中
  • 从 Python 访问/调用 Simulink

    我想在 Simulink 中对系统进行建模 然后从 python 程序访问该模拟以为其提供新的条件或输入 我知道有一个模块允许您从 Python 访问 Matlab 引擎 但这有点不同 我想要一个在 Simulink 中建模的系统 并使用
  • 当“参数列表太长”时,如何删除所有超过 3 天的文件?

    我有一个日志文件目录 其中包含 82000 个文件和目录 大约各半 我需要删除所有超过 3 天的文件和目录 在包含 37000 个文件的目录中 我可以使用以下命令执行此操作 find mtime 3 exec rm 但是对于 82000 个
  • 通过 EWS 为用户提供时区和工作时间

    是否可以通过EWS获取用户的时区和工作时间 我能够提取当前用户的 TZ 和工作时间 初始化 ExchangeService 的帐户 UserConfiguration usrConfig UserConfiguration Bind ser
  • vb.net返回多种类型的json对象?

    我需要从 Web 服务返回一些数据 如下所示 data page 1 data count 12883 data rows 0 id 1 data rows 0 name bob data rows 1 id 2 data rows 1 n
  • 在 C# 4.0 中,为什么方法中的输出参数不能是协变的?

    鉴于这个神奇的界面 public interface IHat