我想知道为什么第一次调用 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/