C#泛型-推断静态工厂成员的类型
我希望调用使用泛型的类的静态成员,而不指定类型并让编译器推断它们 例如,这是我想要使用的通用类,带有静态工厂成员:C#泛型-推断静态工厂成员的类型,c#,generics,C#,Generics,我希望调用使用泛型的类的静态成员,而不指定类型并让编译器推断它们 例如,这是我想要使用的通用类,带有静态工厂成员: public class GenericClass<T> { public T Member; // Constructor public GenericClass(T value) { Member = value; } // static factory method public st
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);
}
}
公共类GenericClass
{
公共事务委员会成员;
//建造师
公共泛型类(T值)
{
成员=值;
}
//静态工厂法
公共静态泛型类StaticFactory(T resultData)
{
返回新的GenericClass(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
{
public GenericClass returnResult1()
{
返回GenericClass.StaticFactory(“不会编译,但很明显t是字符串”);
}
public GenericClass returnResult2()
{
返回GenericClass.StaticFactory(“不会编译,但很明显t是字符串”);
}
}
使用泛型类型“SampleStatic.GenericClass”时出现错误1需要1个类型参数
为什么我不能对静态成员执行以下操作
public void ICanInferTheType<T1>(T1 item);
public void returnResult4()
{
ICanInferTheType("Compiles, recognizes type string");
}
public类型(T1项);
public void returnResult4()
{
我可以推断类型(“编译、识别类型字符串”);
}
谢谢-泛型推理只对方法调用发生。在您的情况下,您需要它来引用类。给定
class GenericClass{…}
,任何不带类型参数的对GenericClass
的引用都是编译错误。唯一可以推断泛型参数的时间是针对方法签名上声明的泛型参数
然而,你无论如何都可以实现你的目标。如果您声明这个附加类,您将能够以您想要的方式调用该方法。这是因为泛型参数被移动到方法
public static class GenericClass {
// static factory method
public static GenericClass<T> StaticFactory<T>(T resultData) {
return new GenericClass<T>(resultData);
}
}
公共静态类GenericClass{
//静态工厂法
公共静态泛型类StaticFactory(T resultData){
返回新的GenericClass(resultData);
}
}
好的,多亏了@recursive!这个答案几乎是完美的,它还需要一个方法的名称,如下所示:
public static class GenericClass
{
// static factory method
public static GenericClass<T> StaticFactory<T>(T resultData)
{
return new GenericClass<T>(resultData);
}
}
公共静态类GenericClass
{
//静态工厂法
公共静态泛型类StaticFactory(T resultData)
{
返回新的GenericClass(resultData);
}
}
解决方法是使用GenericClass.StaticFactory(“字符串”)声明它
@ryanyuyu真正的解决方法确实是将工厂移动到具有相同名称的非泛型类。。。但这也行。@AlexeiLevenkov这是有道理的,因为它是一个工厂。Thx这是正确的方向,但如果我将其作为一个单独的类添加,它将不会编译:错误1找不到类型或命名空间名称“t”(是否缺少using指令或程序集引用)。明白了,它缺少函数名StaticFactory中的参数-在下面发布了答案,感谢@recursiveYou是对的,我错过了通用参数声明。我很高兴它对你有用。