C# 为什么ref local赋值必须是标识转换?
对ref locals和ref returns有一个限制,即在local/return的类型和实际值之间必须存在标识转换。所以这是非法的:C# 为什么ref local赋值必须是标识转换?,c#,cil,ref,C#,Cil,Ref,对ref locals和ref returns有一个限制,即在local/return的类型和实际值之间必须存在标识转换。所以这是非法的: 类基类{} 派生类:基{} C类 { 私有派生的_派生的=新派生的(); public ref Base GetRef()=>ref\u派生; } 但是由于动态和对象之间存在身份转换,因此这是合法的: C类 { 私有对象_object=新对象(); public ref dynamic GetRef()=>ref\u对象; } 所以问题是,这一限制背后的
类基类{}
派生类:基{}
C类
{
私有派生的_派生的=新派生的();
public ref Base GetRef()=>ref\u派生;
}
但是由于动态
和对象
之间存在身份转换,因此这是合法的:
C类
{
私有对象_object=新对象();
public ref dynamic GetRef()=>ref\u对象;
}
所以问题是,这一限制背后的原因是什么?我所能假定的是,IL在引用之间根本没有转换,因此如果您的方法返回Base&
,它必须准确地返回该值,因为您无法在派生的&
和基本的&
之间进行转换。但是为什么你不能呢?是吗
实际上,
dynamic
是带有附加元数据的object
。不允许使用第一个的原因是,如果是,调用方可以将任何对象引用填充到它返回的对象中,只要该对象是基
或从中派生。然而,它所引用的变量要求填充到它里面的东西是一个派生的;c、 GetRef()=新基()代码>你到底在哪里看到提到“身份转换”?@LasseVågsætherKarlsen是的,在IL上没有动态这样的东西,所以这也是一个对象&
。你给出的理由很简单很合理,我觉得有点傻,因为我没有看到。