C# 泛型约束:强制类型具有带参数的静态函数和构造函数

C# 泛型约束:强制类型具有带参数的静态函数和构造函数,c#,.net,generics,generic-constraints,C#,.net,Generics,Generic Constraints,我知道你可以写: class GenericClass<T> where T : new() { } 您能否强制执行T具有静态函数(例如,void F()),以便在泛型类中使用此函数?比如: class GenericClass<T> where T : void F() { void G () { T.F(); } } class GenericClass其中T:void F() { 空G() { T.F(); } } 我

我知道你可以写:

class GenericClass<T> where T : new()
{ 

}
  • 您能否强制执行
    T
    具有静态函数(例如,
    void F()
    ),以便在泛型类中使用此函数?比如:

    class GenericClass<T> where T : void F()
    { 
       void G ()
       {
           T.F();
       }
    }
    
    class GenericClass其中T:void F()
    { 
    空G()
    {
    T.F();
    }
    }
    
    我知道您可以指定
    T
    实现接口,但我不希望这样。我想指定
    T
    有一个静态函数


  • 不,在C#中没有这样的

    我以前曾建议,它可以合理地表达这一点。它们只对泛型类型约束有用(无论如何,我怀疑),但您可以表示:

    • 具有任意参数的构造函数
    • 静态方法和属性
    • 操作员
    在我看来,最后一点特别有趣,它允许在数字类型上使用具有适当加法和除法运算符的通用“平均”方法


    我相信微软的一些人也想到过类似的事情,但我没有听到任何迹象表明他们正在积极地进行这项工作。

    每当我想到过去为了绕过这一限制而不得不组装的乱七八糟的东西时,我都会不寒而栗。。(我经常处理泛型)。我多么渴望一个静态接口,一个很好的解决方案。显然这是C语言的局限,而不是CLR语言的局限。例如,F#允许施加“显式成员约束”,比如在类型上存在方法或属性…@Paul:我很想看看这如何转化为IL。。。它包括静态成员吗?@Jon所以我。。。我自己还没试过。旋转或剪切并粘贴一些代码(例如,来自,他经常引用您),然后查看IL。是的,在所有示例中都明确使用了静态成员。我假设这些功能不是由某种F#编译器黑客完成的,它似乎真的受到CLI的支持。有趣的是,直到昨天,明确的成员约束在MSDN上才被标记为“非通用”。今天,这种限制已经消失了。@Paul,@Jon:我不相信“静态接口”(在F#aka,duck-typing中称为显式成员约束)与CLR有任何关系。这纯粹是F#编译器的一项功能,使用此类约束的函数必须标记为
    inline
    。可能的重复,以及
    class GenericClass<T> where T : void F()
    { 
       void G ()
       {
           T.F();
       }
    }