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是对的,我错过了通用参数声明。我很高兴它对你有用。