【问题标题】:Doing math in C# generic method (known with unknown)用 C# 泛型方法做数学(已知与未知)
【发布时间】:2016-07-18 05:55:33
【问题描述】:

邦乔诺,各位。您能否解释一下如何在泛型方法中执行操作。我想要一个由不同无符号整数组成的随机数组。 IDE 不允许我将 Double (和其他)与通用结构相乘。我尝试以任何方式进行类型转换都不起作用。 也许我最好停止“设计自行车”并从通用方法中调用每种整数类型的几种方法之一?

public static T[] getRandArray<T>(int amount) where T: struct
{
    FieldInfo maxValueField =
        typeof(T).GetField(
            "MaxValue",
            BindingFlags.Public | BindingFlags.Static
        );

    T maxValueOfT = (T)maxValueField.GetValue(null);

    Random randNum = new Random();

    T[] array = new T[amount];

    for (int i = 0; i < amount; i++)
    {
        array[i] = (T)(randNum.NextDouble()) * maxValueOfT;
    }

    return array;
}

【问题讨论】:

标签: c# generics math methods


【解决方案1】:

它不适用于泛型。

  • 如果您的方法只需要uint[],则用它替换泛型类型。
  • 如果您不仅需要uint[],还需要任何其他类型的数组,例如int[] 那么你必须为你的方法创建一个重载。

不幸的是,对于泛型类型没有任何约束可以让你对它们进行一些数学运算。

顺便说一句。我建议您在静态类中创建一个 Random 的实例作为静态字段,然后在方法中使用它。

【讨论】:

    【解决方案2】:

    只有泛型方法才应该是泛型的。唯一定义的约束是 T : struct。假设我定义了以下内容:

    public struct Point 
    { 
        public int X { get; set; }
        public int Y { get; set; }
    }
    

    我可以为 getRandArray 提供一个Point,但你如何使用它?

    相反,选择满足您需求的类型。如果您提供的接口合适,您通常仍然可以利用隐式转换来实现您的目标

    【讨论】:

      猜你喜欢
      • 2016-04-10
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多