C# 仅在构造函数中设置类泛型值

C# 仅在构造函数中设置类泛型值,c#,.net,generics,C#,.net,Generics,有没有办法只在构造函数中设置类的泛型类型(T),而不在声明中设置 public class Gen<T> { } public class Da { } public class Program { public static Gen<?> gen; public static void Main(string[] args) { gen = new Gen<Da>(); } } 公共类Gen { } 公

有没有办法只在构造函数中设置类的泛型类型(T),而不在声明中设置

public class Gen<T>
{
}

public class Da
{
}

public class Program
{
    public static Gen<?> gen;

    public static void Main(string[] args)
    {
        gen = new Gen<Da>();
    }
}
公共类Gen
{
}
公共类Da
{
}
公共课程
{
公共静态发电机;
公共静态void Main(字符串[]args)
{
gen=新gen();
}
}

是,但只能通过使用非泛型变量,如
对象、任何非泛型基类或泛型类实现的任何接口

public interface Intf {
  void DoSomething();
}

public class Gen<T>: Intf {
  public void DoSomething() {
    // can use the generic stuff here
  }
}

public class Da {

}

public class Program {
    public static Intf gen;
    public static void Main(string[] args) {
        gen = new Gen<Da>();
        gen.DoSomething();
    }
}
公共接口Intf{
无效剂量();
}
公共类Gen:Intf{
公共无效剂量测定法(){
//你可以在这里用一般的东西
}
}
公共类Da{
}
公共课程{
公共静态Intf gen;
公共静态void Main(字符串[]args){
gen=新gen();
DoSomething将军();
}
}

如果我正确理解您的需求,实现这一点的最简单方法是使用非通用接口:

interface IGen { }
那么您的泛型类可以是:

class Gen<T> : IGen { }
类Gen:IGen{}
用法是:

IGen objectGen = new Gen<object>();
IGen intGent = new Gen<int>();
IGen objectGen=new Gen();
IGen intGent=新的Gen();

这样做,你不会失去泛型的好处吗?你能解释一下你为什么想要这样的构造吗?@SteveB,一点也不。这允许您为实现提供强类型泛型类,同时允许在非泛型上下文中使用它们。或者您可以实现非泛型抽象
Gen
基类,该基类公开不需要泛型的公共成员。(或者任何对你的设计有意义的东西)@ChrisSinclair,是的,当然-但那是一个“非通用变量”,你不同意吗?你是对的。我只是没有那样读,特别是当你的例子是
对象时,对不起。@ChrisSinclair,别担心,我把这个词改得更清楚了。谢谢你的反馈。(但不管出于什么原因,人们似乎更喜欢里奇的答案。)