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

标签 c# c#-4.0 covariance out

鉴于这个神奇的界面:

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

这个类的层次结构:

public class Rabbit { }

public class WhiteRabbit : Rabbit { }

我现在可以编译了:

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

太棒了。但是,如果我以不同的方式定义接口(interface)会怎样:

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

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

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

最佳答案

很有趣。但是,在 CLI 级别没有“out”这样的东西——只有“ref”;有一个属性可以帮助编译器(用于明确分配),它说“你不需要传入它”。

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

关于c# - 在 C# 4.0 中,为什么方法中的输出参数不能协变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/527758/

相关文章:

c# - 如何在 Xamarin 表单中使用 MVVM 仅为 Collection View 中的选定框架设置颜色?

c# - 我可以监听我创建的 Windows 服务事件吗?

c# - 如何将 'System.Windows.Media.Imaging.BitmapImage' 转换为 'System.Drawing.Image' ?

java - 如何在ArrayList中使用多态性?

未明确指定类型参数时,Scala 下限类型参数不起作用

c# - 如何为 DLL 而不是 EXE 选择 sgen 生成的 XmlSerializer DLL?

c# - 获取 GridViewColumn 的父级

c#-4.0 - 如何使用 youtube v3 api 和 C# 从 youtube 删除视频

c# - C# 4.0 中泛型类型参数的变体是否更接近更高种类的类型?

C# 数据表和 PK