是否支持非泛型类中的泛型构造函数?

gre*_*man 46 c# generics constructor

是不支持,是否支持,但我必须做一些技巧?

例:

class Foo
{
  public Foo<T1,T2>(Func<T1,T2> f1,Func<T2,T1> f2)
  {
     ...
  }
}
Run Code Online (Sandbox Code Playgroud)

泛型只在构造函数中使用,没有依赖于它们的字段/属性,我使用它(泛型)来强制执行f1和f2的类型相关.

备注:我找到了解决方法 - 静态方法创建,但无论如何我很好奇为什么我有直接方法的问题.

Jon*_*eet 71

不,通用构造函数在泛型或非泛型类中都不受支持.同样,不支持通用事件,属性和终结器.

偶尔我同意它会很方便 - 但语法看起来很糟糕.例如,假设你有:

public class Foo<T> {}

public class Foo
{
    public Foo<T>() {}
}
Run Code Online (Sandbox Code Playgroud)

什么会

new Foo<string>()
Run Code Online (Sandbox Code Playgroud)

做?调用非泛型类的泛型构造函数,还是泛型类的普通构造函数?你必须以某种方式区分它们,它会很混乱:(

同样,考虑泛型类中的泛型构造函数:

public class Foo<TClass>
{
    public Foo<TConstructor>() {}
}
Run Code Online (Sandbox Code Playgroud)

你怎么称呼构造函数?希望我们都同意:

new Foo<string><int>()
Run Code Online (Sandbox Code Playgroud)

很可怕......

所以是的,在语义上它偶尔会有用 - 但不幸的是,由此产生的丑陋抵消了这种情况.

  • 一句话 - 泛型类中的构造函数是通用的,因为该类是通用的.但是(接受你的回答)它不能指定**额外的**泛型参数.谢谢你的好例子! (3认同)
  • @macias:我不认为构造函数是通用的,正是因为*它不会引入任何额外的类型参数.你会认为`List <T> .IndexOf`是一个通用方法,只是因为它是泛型类型? (3认同)
  • @Peter:不,同名类问题不是问题,因为尽管您可以*通过arity类型“重载”类,但没有歧义。有关示例,请参见“元组”。 (2认同)

Pet*_*der 24

不支持通用构造函数,但您可以通过简单地定义static返回new 的泛型方法来解决这个问题Foo:

class Foo
{
  public static Foo CreateFromFuncs<T1,T2>(Func<T1,T2> f1,Func<T2,T1> f2)
  {
     ...
  }
}
Run Code Online (Sandbox Code Playgroud)

这是这样使用的:

// create generic dependencies
var func1 = new Func<byte, string>(...);
var func2 = new Func<string, byte>(...);

// create nongeneric Foo from dependencies
Foo myFoo = Foo.CreateFromFuncs<byte, string>(func1, func2);
Run Code Online (Sandbox Code Playgroud)