0

考虑这段代码:

using System;

class EntryPoint{

    static void Main(){
        f(new{ Name = "amir", Age = 24 });
    }

    static void f <T> (T arg){}

}

此代码使用 C# 9 编译器编译。我可以在需要泛型类型的地方发送匿名类型。我的问题是为什么我不能对方法返回类型做同样的事情?

例如,考虑以下代码:

using System;

class EntryPoint{

    static void Main(){
        object obj = f();
    }

    static T f <T> (){
        return new{ Name = "amir", Age = 24 };
    }

}

它将得到以下编译错误:

main.cs(6,22):错误 CS0411:无法从用法中推断方法“EntryPoint.f()”的类型参数。尝试明确指定类型参数。

main.cs(10,16):错误 CS0029:无法将类型“<匿名类型:字符串名称,int Age>”隐式转换为“T”

为什么这些相同的错误不会出现在其他代码中。在其他代码中,匿名类型也隐式转换为 T。为什么这不能在这里发生?

提前感谢您帮助我!

4

1 回答 1

1

匿名类型只是 C# 编译器为您定义的类型。因此,让我们更改您的示例以使用具体类型;

public class Foo {
    public string Name { get; set; }
    public int Age { get; set; }
}

static void Main(){
    f1(new Foo{ Name = "amir", Age = 24 });
}

static void f1<T> (T arg){}

static T f2<T> (){
    return new Foo{ Name = "amir", Age = 24 };
}

现在在第二个例子中应该很明显,类型TFoo不一样。

于 2021-12-08T00:53:25.607 回答