c# - 无法将返回值类型的方法分配给 Func<dynamic>

标签 c# dynamic func

<分区>

我有一个 Func<dynamic> 类型的变量我正在尝试为其分配一个值。如果我将它分配给返回值类型的方法(例如 int ),我会收到错误

'int MethodName()' has the wrong return type

但是,如果我将方法包装在 lambda 调用中,它就可以正常工作。返回引用类型的方法似乎也能正常工作。

private string Test()
{
    return "";
}

private int Test2()
{
    return 0;
}

Func<dynamic> f = Test;           // Works
Func<dynamic> g = Test2;          // Does not
Func<dynamic> h = () => Test2();  // Works

直接赋值有什么问题?

最佳答案

这与dynamic无关或 delegate TResult Func<out TResult>() .您将在此代码中看到相同的行为:

interface I<out T> { }
class C<T> : I<T> { }
...
I<int> a = new C<int>();
I<string> b = new C<string>();
I<object> x = a; // compiler error
I<object> y = b; // no compiler error

出于某种原因,像 int 这样的值类型将自动转换为 objectdynamic ,但是I<int>不会自动转换为I<object>I<dynamic> .我找不到在语言引用中指定的位置。

原因Func<dynamic> h = () => Test2();在你的代码中工作是因为它只需要 int转换到dynamic隐含地,这很好。它不需要 Func<int>转换到Func<dynamic>含蓄地。

关于c# - 无法将返回值类型的方法分配给 Func<dynamic>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33553172/

相关文章:

c# - 使用动态 LINQ(或泛型)查询/筛选 Azure 表

asp.net - 在asp.net网站上动态加载用户控件(ascx)

c# - 如何通过上下文菜单控制动态生成的控件的可见性?

c# - 创建一个函数,它给我们另一个函数

c# - 我如何传递 MemberInitExpression 对象

c# - 如何使用声明

c# - 我可以将 TimeSpan 用作具有默认值的可选参数吗?

c# - 使用文件中的字体绘制文本不起作用

c# - GZipStream.Close 导致 ObjectDisposedExeption : Why?

c# - 获取对作为函数传递的 Lambda 中的参数的引用