相关疑难解决方法(0)

为什么即使只有一种可能的返回类型,方法调用表达式也具有动态类型?

灵感来自这个问题.

简短版本:M(dynamic arg)如果只有一个重载M或所有重载M具有相同的返回类型,为什么编译器不能找出编译时类型?

根据规范,§7.6.5:

如果至少满足下列条件之一,则动态绑定调用表达式(第7.2.2节):

  • primary-expression具有编译时类型dynamic.

  • 可选参数列表的至少一个参数具有编译时类型dynamic,而primary-expression没有委托类型.

这是有道理的

class Foo {
    public int M(string s) { return 0; }
    public string M(int s) { return String.Empty; }
}
Run Code Online (Sandbox Code Playgroud)

编译器无法弄清楚编译时的类型

dynamic d = // dynamic
var x = new Foo().M(d);
Run Code Online (Sandbox Code Playgroud)

因为直到运行时才会知道M调用了哪个重载.

但是,为什么编译器无法计算编译时类型,如果M只有一个重载或所有重载M返回相同的类型?

我想了解为什么规范不允许编译器在编译时静态地键入这些表达式.

c# dynamic

15
推荐指数
1
解决办法
1022
查看次数

为什么C#编译器无法使用动态推断lambda表达式的类型?

请考虑以下代码.出于这个原因,我想弄清楚C#编译器在使用lambda表达式时无法推断该函数Map返回Aw/o显式类型规范的类型.

这种情况的文件的任何理由或参考解释了这种行为?

class Program
{
    public class A
    {
    }

    public static A Map(dynamic x)
    {
        return new A();
    }

    static void Main(string[] args)
    {
        IEnumerable<dynamic> d = new dynamic[] { };

        // OK
        IEnumerable<A> a1 = d.Select(Map);

        // OK
        IEnumerable<A> a2 = d.Select(x => (A)Map(x));

        // NOT OK
        // Cannot implicitly convert type 'IEnumerable<dynamic>' to 'IEnumerable<A>'
        IEnumerable<A> a3 = d.Select(x => Map(x));
    }
}
Run Code Online (Sandbox Code Playgroud)

c# lambda type-inference

5
推荐指数
0
解决办法
179
查看次数

标签 统计

c# ×2

dynamic ×1

lambda ×1

type-inference ×1