I'd like to know why the first call to Bar(ref object) doesn't work and the second one does. Seems silly considering I'm passing in a type object either way, and passing in an anonymous type to Foo(object) works fine. Why would ref, something that has to do with memory location influence the calls to Bar()?
Consider the following snippet:
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);
}
I see in the answers below suggestions on how to make the code compile, but that's not what I'm after. I'd like to know specifically why making it a ref parameter prevents compilation when passing in an anonymous type to Foo() worked fine.
The main reason is a little hidden: this happens because your passed in argument has to be the exact same type as the type defined in the parameter.
This is (ambiguously?) stated in the specification section $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.
For this very same reason, passing a subclass to a method that uses a reference parameter doesn't work. This is described in Jeff Mercado's answer.
In your first example you don't use ref so polymorphism works (an anonymous type is a subtype of object) and in the last example you declare it as object which means you use the exact same type as the reference parameter.
Why should it? The variable b is not declared as an object as is expected by the method.
Consider this example:
string s;
GetValue(ref s); // no...
void GetValue(ref object x)
{
x = 123;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With