Arhn - архитектура программирования

Использование ключевого слова C# params в конструкторе универсальных типов

У меня есть общий класс на С# с двумя конструкторами:

public Houses(params T[] InitialiseElements)
{}
public Houses(int Num, T DefaultValue)
{}

Построение объекта с использованием int в качестве универсального типа и передачей двух int в качестве аргументов приводит к вызову «неправильного» конструктора (с моей точки зрения).

Например. Houses<int> houses = new Houses<int>(1,2) - вызывает 2-й конструктор. Передача любого другого количества целых чисел в конструктор вызовет 1-й конструктор.

Есть ли способ обойти это, кроме удаления ключевого слова params и принуждения пользователей передавать массив T при использовании первого конструктора?

17.10.2008

Ответы:


1

Более ясным решением было бы иметь два статических фабричных метода. Если вы поместите их в необобщенный класс, вы также можете извлечь выгоду из вывода типа:

public static class Houses
{
    public static Houses<T> CreateFromElements<T>(params T[] initialElements)
    {
        return new Houses<T>(initialElements);
    }

    public Houses<T> CreateFromDefault<T>(int count, T defaultValue)
    {
        return new Houses<T>(count, defaultValue);
    }
}

Пример вызова:

Houses<string> x = Houses.CreateFromDefault(10, "hi");
Houses<int> y = Houses.CreateFromElements(20, 30, 40);

Тогда конструктор вашего универсального типа не нуждается в бите «params», и путаницы не будет.

17.10.2008

2

Возможно, вместо Params вы могли бы передать IEnumerable

public Houses(IEnumerable<T> InitialiseElements){}
17.10.2008

3

Второй конструктор — это более точное совпадение, которое является критерием, используемым для оценки правильного конструктора.

17.10.2008

4

Учитывая следующее, поскольку в оригинале не было слишком много информации о классе и т. д.

Компилятор решит, что new House(1,2) точно соответствует второму конструктору, и использует его. Обратите внимание, что я выбрал ответ с наибольшим количеством голосов, и он не сработал.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace GenericTest
{
    public class House<T>
    {
        public House(params T[] values)
        {
            System.Console.WriteLine("Params T[]");
        }
        public House(int num, T defaultVal)
        {
            System.Console.WriteLine("int, T");
        }

        public static House<T> CreateFromDefault<T>(int count, T defaultVal)
        {
            return new House<T>(count, defaultVal);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            House<int> test = new House<int>(1, 2);                         // prints int, t
            House<int> test1 = new House<int>(new int[] {1, 2});            // prints parms
            House<string> test2 = new House<string>(1, "string");           // print int, t
            House<string> test3 = new House<string>("string", "string");    // print parms
            House<int> test4 = House<int>.CreateFromDefault<int>(1, 2);     // print int, t
        }
    }
}
17.10.2008
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..