c# - 我可以将匿名对象传递给需要类型对象引用参数的方法吗?

标签 c# .net anonymous-types ref

我想知道为什么第一次调用 Bar(ref object) 不起作用,而第二次调用却起作用。考虑到我以任何方式传递类型 object 似乎很愚蠢,and 将匿名类型传递给 Foo(object) 工作正常。为什么与内存位置有关的 ref 会影响对 Bar() 的调用?

考虑以下片段:

static void Foo(object obj)
{ }

static void Bar(ref object obj)
{ }

static void Main()
{
    // Compiles
    var a = new { };
    Foo(a);

    // Does not compile
    var b = new { };
    Bar(ref b);

    // Compiles
    object c = new { };
    Bar(ref c);
}

我在下面的答案中看到了关于如何编译代码的建议,但这不是我想要的。我想具体了解为什么在将匿名类型传递给 Foo() 时将其设为 ref 参数会阻止编译。

最佳答案

主要原因有点隐蔽:发生这种情况是因为您传入的参数必须是与参数中定义的类型完全相同的类型。

这(含糊不清?)在规范部分 $10.6.1.2 中说明:

When a formal parameter is a reference parameter, the corresponding argument in a method invocation must consist of the keyword ref followed by a variable-reference (§5.3.3) of the same type as the formal parameter.

出于同样的原因,将子类传递给使用引用参数的方法是行不通的。 Jeff Mercado 的回答中对此进行了描述。

在您的第一个示例中,您没有使用 ref,因此多态性有效(匿名类型是 object 的子类型),在最后一个示例中,您将其声明为 object 这意味着您使用与引用参数完全相同的类型。

关于c# - 我可以将匿名对象传递给需要类型对象引用参数的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28597436/

相关文章:

c# - 谷歌 Oauth 错误 : At least one client secrets (Installed or Web) should be set

c# - 在 C# 中规范化目录名称

c# - 在 .NET 中从 XML 文档中过滤元素的最简单方法

C# app.config 问题 - ConfigurationErrorsException : Unrecognized element 'setting'

C#:匿名变量的内存分配

c# - 为什么 C# 不允许匿名转换为对象?

c# - Unity/C# 游戏存档迁移

c# - 将不同的模型传递给局部 View

.net - Linux 上 Mono 的现状?

vb.net - 更改datagrid列的顺序或索引