我想调用使用泛型的类的静态成员,而不指定类型并让编译器推断它们。
例如,这是我想要使用的泛型类,使用静态工厂成员:
public class GenericClass<T>
{
public T Member;
// Constructor
public GenericClass(T value)
{
Member = value;
}
// static factory method
public static GenericClass<T> StaticFactory(T resultData)
{
return new GenericClass<T>(resultData);
}
}
如果我尝试以下不编译:
public class Class1
{
public GenericClass<string> returnResult1()
{
return GenericClass.StaticFactory("Won't Compile, but it's clear that T is a string");
}
public GenericClass returnResult2()
{
return GenericClass.StaticFactory("Won't Compile, but it's clear that T is a string");
}
}
错误1使用泛型类型'SampleStatic.GenericClass'需要1个类型参数
为什么我不能像静态成员一样喜欢以下内容?
public void ICanInferTheType<T1>(T1 item);
public void returnResult4()
{
ICanInferTheType("Compiles, recognizes type string");
}
谢谢 -
答案 0 :(得分:5)
通用推理仅适用于方法调用。在你的情况下,你需要它来引用一个类。给定class GenericClass<T> { ... }
,对GenericClass
没有类型参数的任何引用都是编译错误。可以推断出通用参数的唯一时间是在方法签名上声明的泛型参数。
但是,无论如何,你都可以实现目标。如果您声明这个额外的类,您将能够以您想要的方式调用该方法。那是因为通用参数被移动到方法中。
public static class GenericClass {
// static factory method
public static GenericClass<T> StaticFactory<T>(T resultData) {
return new GenericClass<T>(resultData);
}
}
答案 1 :(得分:2)
好的,感谢@recursive!这个答案几乎是完美的,它需要一个更多的方法名称,如下:
public static class GenericClass
{
// static factory method
public static GenericClass<T> StaticFactory<T>(T resultData)
{
return new GenericClass<T>(resultData);
}
}