考虑以下代码:
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 };
}
现在,在第二个示例中应该很明显,类型T
和Foo
不相同。