【问题标题】:Constrain type to allow addition/subtraction operations (+/-) in C#约束类型以允许在 C# 中进行加法/减法运算 (+/-)
【发布时间】:2011-07-27 20:25:49
【问题描述】:

这可能吗?

public interface Foo<TBar>
  where TBar : (can use the '+' and '-' operators)

谢谢。

【问题讨论】:

    标签: c# types


    【解决方案1】:

    不,这是不可能的。

    理论上,您可以将 TBar 约束为实现这些运算符的类型,但运算符是静态的,它们不是继承的。

    这意味着您将有效地将您的类型限制为基本类型,在这种情况下,您可以完全放弃泛型。

    不,您不能将 TBar 泛型参数限制为“实现这些运算符的任何类型”,它只是在该语言中不可用。

    【讨论】:

      【解决方案2】:

      是和否。泛型参数只能被限制为

      • 实现接口
      • 有一个可访问的无参数构造函数 (new())
      • 具有特定的基本类型
      • 做一个结构/类

      其中唯一对+- 运算符有用的是基类型。因此,如果基本类型包含这些运算符,您可以约束 TBar 来实现它们。

      但是这在一般意义上是行不通的。无论您选择哪种基本类型,它都无法与+- 最常用的类型一起使用。即intdoublestring 等...因为它们继承自没有此约束的ValueType

      【讨论】:

        【解决方案3】:

        您可以重载运算符:

        public static TBar operator +(TBar c1, TBar c2) 
        {
           return ... // do the math
        }
        

        【讨论】:

        • 好的,你想为不知道有这种属性的东西重载加法。返回 c1+c2 ?
        【解决方案4】:

        您可以创建一个类型Foo 来重载这两个运算符,然后将您的泛型类型约束到它。但是,您不能将泛型参数限制为要求任何任意类型临时重载此类运算符。

        【讨论】:

        • 试图理解,您是说不能将泛型类型限制为实现运算符的类型?这与Interface IRepository&lt;T&gt; where T : ModelBase 有何不同?
        • @hometoast,您当然可以这样做——您可以将类型参数限制为重载这些运算符的 特定 类型。我的观点是,OP 似乎想将类型限制为 any 类型,因此 long 因为它重载了这些运算符。我强调后者是不可能的。
        • 有道理。将泛型类型限制为 double、float、int 等(即可以使用 '+' 和 '-' 但不重载它们的值类型)怎么样?我想您不能将泛型类型限制为值类型。
        • @ken,正确,除了标识类或接口的类型(不是特定的枚举或其他值类型)之外,有效的约束是文字 classnew()struct。但是,使用 struct 您可以将其限制为 all 值类型——但由于某些值类型不会重载这些运算符,因此您将无法使用 +- 运算符TBar 类型的值。
        猜你喜欢
        • 2010-09-16
        • 2020-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-20
        • 1970-01-01
        • 2012-04-12
        相关资源
        最近更新 更多