C# C生成随机数的通用方法 我看到C++有类似的问题。有人知道为什么这个方法在非泛型的情况下有效,但是一旦我把它变成泛型,代码的随机数部分就会失败吗? 错误:无法将int类型隐式转换为“T”。如果我不能使用泛型,我将不得不为每个不同长度的数组反复重写相同的函数 public void fillGenericArray<T>(T[] inputArray) where T : IComparable { var randomNumb1 = new Random(); for (int i = 0; i < inputArray.Length - 1; i++) { Console.WriteLine($"{inputArray[i] = randomNumb1.Next(1, 501)},"); } }

C# C生成随机数的通用方法 我看到C++有类似的问题。有人知道为什么这个方法在非泛型的情况下有效,但是一旦我把它变成泛型,代码的随机数部分就会失败吗? 错误:无法将int类型隐式转换为“T”。如果我不能使用泛型,我将不得不为每个不同长度的数组反复重写相同的函数 public void fillGenericArray<T>(T[] inputArray) where T : IComparable { var randomNumb1 = new Random(); for (int i = 0; i < inputArray.Length - 1; i++) { Console.WriteLine($"{inputArray[i] = randomNumb1.Next(1, 501)},"); } },c#,generics,random,numbers,C#,Generics,Random,Numbers,我不得不看两遍,但问题是: 因为inputArray是一个“T型数组” 那么即使我是一个int,这个表达式 inputArray[i] 返回类型T而不是类型int 因此,反过来说,必须给它指定一个类型T 这样的通用方法可能会实现您的目标: public static void fillGenericArray<T>(T[] inputArray) { for (int i = 0; i < inputArray.Length; i++) {

我不得不看两遍,但问题是:

因为inputArray是一个“T型数组”

那么即使我是一个int,这个表达式

inputArray[i] 
返回类型T而不是类型int

因此,反过来说,必须给它指定一个类型T

这样的通用方法可能会实现您的目标:

public static void fillGenericArray<T>(T[] inputArray)
{
    for (int i = 0; i < inputArray.Length; i++)
    {
        // Where T has a CTor that takes an int as an argument
        inputArray[i] = (T)Activator.CreateInstance(typeof(T), Random.Next(1, 501));
    }
}
在的帮助下稍微修改-使用Enumerable.Range查看答案

下面是一个测试跑步者:

class Program
{
    static Random Random { get; } = new Random();
    const int LENGTH = 10;
    static void Main(string[] args)
    {

        Console.WriteLine();
        Console.WriteLine("With a generic you could do this...");


        SomeClass[] arrayOfT;
        arrayOfT = new SomeClass[LENGTH];
        fillGenericArray<SomeClass>(arrayOfT);
        Console.WriteLine(string.Join(Environment.NewLine, arrayOfT.Select(field=>field.Value)));


        Console.WriteLine();
        Console.WriteLine("But perhaps it's redundant, because Enumerable is already Generic!");

        arrayOfT = Enumerable.Range(1, LENGTH).Select(i => new SomeClass(Random.Next(1, 501))).ToArray();
        Console.WriteLine(string.Join(Environment.NewLine, arrayOfT.Select(field => field.Value)));

        // Pause
        Console.WriteLine(Environment.NewLine + "Any key to exit");
        Console.ReadKey();
    }
    public static void fillGenericArray<T>(T[] inputArray)
    {
        for (int i = 0; i < inputArray.Length; i++)
        {
            inputArray[i] = (T)Activator.CreateInstance(typeof(T), Random.Next(1, 501));
        }
    }
    class SomeClass
    {
        public SomeClass(int value)
        {
            Value = value;
        }
        public int Value { get; set; }
    }
}

这个例子来自GitHub。

没有理由使用泛型。只需将T替换为int,您将拥有一个函数,该函数根据您的问题和下面的注释来执行您想要的操作

编辑:从你的评论来看,你似乎误解了泛型的目的。非泛型函数将适用于数组的所有长度


并回答为什么对泛型的更改失败。您正试图将int赋值给泛型类型T,它可以是任何类型,编译器将不允许这样的强制转换。

那么您希望您的代码对FillGenericarArraySomeGuidarray;,做什么呢;?它从1到500生成一个100整数的随机列表。例如,这段代码可以工作:public void fillonehundrayint[]onehundrayray{var randomNumb1=new Random;For int i=0;irandom.Next1,501.ToArrayan,顺便说一句,这是一个很好的推断,但如果是这种情况,我们可能会要求将OP问题改写为类似于使用随机数初始化可变长度数组的内容。我自己也不太确定关键问题是关于泛型还是关于泛型。但无论如何都值得称赞。是的,问题的标题或正文都应该改写。我期待header.mcc如果从标题中删除generic一词,我将更新您的答案:
class Program
{
    static Random Random { get; } = new Random();
    const int LENGTH = 10;
    static void Main(string[] args)
    {

        Console.WriteLine();
        Console.WriteLine("With a generic you could do this...");


        SomeClass[] arrayOfT;
        arrayOfT = new SomeClass[LENGTH];
        fillGenericArray<SomeClass>(arrayOfT);
        Console.WriteLine(string.Join(Environment.NewLine, arrayOfT.Select(field=>field.Value)));


        Console.WriteLine();
        Console.WriteLine("But perhaps it's redundant, because Enumerable is already Generic!");

        arrayOfT = Enumerable.Range(1, LENGTH).Select(i => new SomeClass(Random.Next(1, 501))).ToArray();
        Console.WriteLine(string.Join(Environment.NewLine, arrayOfT.Select(field => field.Value)));

        // Pause
        Console.WriteLine(Environment.NewLine + "Any key to exit");
        Console.ReadKey();
    }
    public static void fillGenericArray<T>(T[] inputArray)
    {
        for (int i = 0; i < inputArray.Length; i++)
        {
            inputArray[i] = (T)Activator.CreateInstance(typeof(T), Random.Next(1, 501));
        }
    }
    class SomeClass
    {
        public SomeClass(int value)
        {
            Value = value;
        }
        public int Value { get; set; }
    }
}