Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么ref local赋值必须是标识转换?_C#_Cil_Ref - Fatal编程技术网

C# 为什么ref local赋值必须是标识转换?

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对象; } 所以问题是,这一限制背后的

对ref locals和ref returns有一个限制,即在local/return的类型和实际值之间必须存在标识转换。所以这是非法的:

类基类{}
派生类:基{}
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上没有动态这样的东西,所以这也是一个
    对象&
    。你给出的理由很简单很合理,我觉得有点傻,因为我没有看到。