简体   繁体   中英

Why the type is System.Object here?

Here is some piece of code :

Func<dynamic> f1 = new Func<dynamic>(() => 10);
Func<int> f2 = () => 10;

Console.Write(f1.Method.ReturnType);
Console.Write(" and " + f2.Method.ReturnType );

Output : System.Object and System.Int32

My question is :

Why dynamic type inferred by DLR (type that is used for dynamic ) here is System.Object and is not System.Int32 ? It's not very logical as it also involves boxing of the Int32 struct to object.

As far as i understand, when we check type here we do it dynamically on execution time because we use Reflection. So it's known to DLR by then that it's int but for some reason it boxes it into Object ... Why?

I've tried to find anything regarding this on SO and googled for it but I couldn't find any answer that explains it all.

Nothing is inferred here. It just doesn't know the type until it executes, and that is why the type given is object . The ( static ) compiler doesn't know the type since you don't know it yet. It is passed around as object and on the calling side it is dynamic again.

This is the same for regular methods:

Console.Write(typeof(Program).GetMethod("F1").ReturnType);

public static dynamic F1()
{
    return 10;
}

Output:

System.Object

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM