【问题标题】:Limit a generic type argument only to be a numeric type [duplicate]将泛型类型参数限制为数字类型
【发布时间】:2017-11-17 06:43:43
【问题描述】:

我正在上课,class numToBin <T>,我需要确保 T 是一个数值(例如,Float, Double, Int, Long, UInt, Ulong, byte, short, BigInteger)。我看到很多帖子都在问同样的问题,但它们都是几年前的。

我的问题是:现在是否对语言进行了任何更改以允许它? 目前我有:

class numToBin <T>
    where T : struct, IEquatable<T>, IFormattable, IComparable, IComparable<T>

但是像T a = 0; 这样的东西不起作用。

【问题讨论】:

标签: c# class generics inheritance types


【解决方案1】:

在类的构造函数中,执行类型检查以匹配适用的类型。如果失败,则抛出 InvalidCastException 或 InvalidArgumentException。

Type t = typeof(T);
bool good = (t == typeof(int)) || (t == typeof(long))|| //...
if(!good)
 //die

【讨论】:

  • 好的,但是如果我这样做 Type[] types = { typeof(double) ....} 那么,(types[2]) a 并没有真正的工作,a+=1 也没有
  • 数字基元的列表不是很长,把它们都查一遍就行了。
【解决方案2】:

不,“数字”类型仍然没有泛型类型约束。

要获得您的T a = 0,您可以使用T a = default(T)。所有数值类型的默认值为 0。

【讨论】:

  • 好的,那么例如一个 += 2 怎么办?
  • @OptimisticPeach 你不能。没有数值接口或约束。
  • 要检查每种类型,我可以做if(default(T) == 0)吗?
  • @OptimisticPeach 我猜不是,编译器会认为您正在将一个对象与一个 int 进行比较(在交互式窗口中检查)。
  • @BradlryDotNet 好的,谢谢。我将实现一个方法来检查它是否是数字
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-05
  • 2019-02-27
相关资源
最近更新 更多