dhivya N Ответов: 3

Универсальные массивы - как получить данные от пользователя


Как принимать входные данные от пользователя для универсальных массивов?

Что я уже пробовал:

class MyGenericArray<T>
{
    T[] arr;
    public MyGenericArray(int size)
    {
        T[] arr = new T[(size)];
        Console.WriteLine("Pls enter {0} no of values", size);
        for (int i = 0; i < size; i++)
        {
            arr[i] = Console.ReadLine() < T >; //am getting error here when i use convert.toint32(console.readline();-error states that generic cannot be converted to int.
        }
    }

F-ES Sitecore

Если вы хотите использовать convert.ToInt32 тогда текст должен быть представлен как int, так что он не является универсальным, не так ли? Это инт. Что делать, если пользователь вводит "true" или "false", или "Hello world"?

Какова общая цель кодекса?

3 Ответов

Рейтинг:
1

OriginalGriff

Когда вы читаете с консоли, она всегда возвращает строку.
Вы не можете использовать универсальный спецификатор, чтобы изменить его на требуемый тип, потому что для этого требуется определенный вызов метода Parse (или TryParse, или даже Convert.ToXXX).

И нет никакого конкретного преобразования из строки в любой тип (в отличие от противоположного направления), потому что нет никакого способа "знать" заранее, что такое данные и как они должны быть преобразованы.
Возможно, можно настроить универсальный метод "преобразовать из строки в мой тип", но только если вы добавите ограничение к универсальному классу, которое ограничивает его классами, реализующими интерфейс, который специально требует, чтобы такой метод преобразования был определен создателем класса.
К сожалению, вы не можете "обратно указать" это для существующих встроенных классов, таких как примитивные int, double, float и т. д., Поэтому в принципе вы вообще не можете делать то, что хотите.


Рейтинг:
1

Richard Deeming

Как уже указывалось, стандартного способа преобразования a не существует. string к определенному классу. Но что ты мочь do - это передача делегата для выполнения преобразования, который снова перекладывает эту ответственность на вызывающего абонента:

class MyGenericArray<T>
{
    private readonly T[] arr;
    
    public MyGenericArray(int size, Func<string, T> parseValue)
    {
        arr = new T[size];
        
        Console.WriteLine("Pls enter {0} no of values", size);
        for (int i = 0; i < size; i++)
        {
            string value = Console.WriteLine();
            arr[i] = parseValue(value);
        }
    }
Использование:
MyGenericArray<int> numbers = new MyGenericArray<int>(42, int.Parse);

MyGenericArray<Person> people = new MyGenericArray<Person>(5, value => new Person(value));

Использование Делегатов (Руководство По Программированию На C#) | Microsoft Docs[^]
Лямбда-Выражения (Руководство По Программированию На C#) | Microsoft Docs[^]