通用约束:强制类型具有带参数的静态函数和构造函数

5
我知道你会写:
class GenericClass<T> where T : new()
{ 

}

要求确保泛型类型 T 有一个空构造函数。
我的问题是:
  1. can you enforce that T has a constructor with a specific type of parameter? Like:

    class SingletonFactoryWithEmptyConstructor<T> where T : new(int)
    
  2. can you enforce that T has a static function (let's say, void F()) so that you can use this function inside the generic class? Like :

    class GenericClass<T> where T : void F()
    { 
       void G ()
       {
           T.F();
       }
    }
    

    I know you can specify that T implements an interface but I don't want that. I want to specify that T has a static function.


可能是重复的问题,关于如何限制泛型类型必须具有接受特定参数的构造函数,请参考How to constrain generic type to must have a construtor that takes certain parameters?。同时也可以参考 calling-a-static-method-on-a-generic-type-parameter - nawfal
1个回答

6

不,C#中没有这样的功能。

我之前建议过"静态接口"可以相对简洁地表达这个概念。它们仅适用于泛型类型约束(我猜想),但是你可以表示:

  • 带任意参数的构造函数
  • 静态方法和属性
  • 运算符

我认为最后一点特别有趣,允许像数字类型的通用“平均值”方法具有适当的加法和除法运算符。

我相信微软的一些人考虑过类似的东西,但我没有听说他们正在积极开发它。


2
每当我想到过去为了绕过这个限制而不得不组装的丑陋代码时,我就感到颤抖。(我经常处理泛型)。我多么渴望一个静态接口,这将是解决问题的好方法。 - Mania
1
显然这是 C# 的限制,而不是 CLR 的限制。例如,F# 允许在类型上强制实施“显式成员约束”,比如要求存在一个方法或属性... - Paul Michalik
@Paul:我很想看看它如何转换为IL...它是否包括静态成员? - Jon Skeet
在对“静态解析类型参数(F#)”进行了第一次(稍微详细一些)阅读之后,我现在也相信这是 F# 编译器的一个特性...不过还需要进一步了解... - Paul Michalik
我已经尝试在这里捕捉当前的状态:https://dev59.com/muo6XIcBkEYKwwoYQiTQ#18565782 - acarlon
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接