构造函数中未使用的泛型参数的泛型类

时间:2014-01-15 10:09:00

标签: c# generics .net-4.0

我想做以下事情:

public class My<T>
{
   public My(G<S> g, T t)
   {
       // code that DOES NOT use S in any way
   } 
}

我得到'无法解析符号S'。 有可能以某种方式做到这一点吗?如果没有,为什么? 我无法改变G,这不是我的班级。

4 个答案:

答案 0 :(得分:1)

您需要:

  1. 不需要<S>G<S>(即用非泛型类型,界面等替换它)。
  2. 或将S作为通用参数添加到类型:

    public class My<T, S>
    {
       public My(G<S> g, T t)
       {
           // code that DOES NOT use S in any way
       } 
    }
    

答案 1 :(得分:1)

与成员函数不同,构造函数不能在其声明中指定泛型类型。要解决此问题,您需要将泛型类型从构造函数中提升到类声明中:

public class My<T,S>
{
   public My(G<S> g, T t)
   {
       // code that DOES NOT use S in any way
   } 
}

如果您打算使用各种构造函数来获取其他泛型类型,则可能会出现问题。

答案 2 :(得分:0)

只需在您的方法中明确声明S:

public class My<T, S>
{
   public My(G<S> g, T t)
   {
       // code that DOES NOT use S in any way
   } 
}

这将编译(除非你在G类的S上有一些条件)。在使用My class时,您必须声明S是什么。

示例将G&lt; S&gt; = Nullable&lt; S&gt; :

public class My<T, S> where S : struct
{
    public My(Nullable<S> g, T t)
    {
        // code that DOES NOT use S in any way
    }
}

使用此实现,您必须在使用My类时定义S(在这种情况下S是int):

var myVar = new My<string, int>(4, string.Empty);

答案 3 :(得分:0)

用户执行后:

public class My<T, S>
{
  public My(G<S> g, T t)
  {
    // Now S will be accessible.
  }
}