为什么我不能在 C# 中将匿名类型作为泛型返回,而我可以对方法参数做同样的事情?



考虑以下代码:

using System;
class EntryPoint{
static void Main(){
f(new{ Name = "amir", Age = 24 });
}
static void f <T> (T arg){}
}

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

例如,考虑以下代码:

using System;
class EntryPoint{
static void Main(){
object obj = f();
}
static T f <T> (){
return new{ Name = "amir", Age = 24 };
}
}

它将得到以下编译错误:

main.cs(6,22(:error CS0411:无法根据用法推断方法"EntryPoint.f(("的类型参数。请尝试显式指定类型参数。

main.cs(10,16(:错误CS0029:无法隐式转换类型'<匿名类型:string Name,int Age>'至"T">

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

提前感谢你对我的帮助!

匿名类型只是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不相同。

相关内容

  • 没有找到相关文章

最新更新