باستخدام C # بارامس الكلمة في منشئ الأنواع العامة

StackOverflow https://stackoverflow.com/questions/213333

  •  03-07-2019
  •  | 
  •  

سؤال

ولدي الطبقة العامة في C # مع 2 الصانعين:

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

وبناء كائن باستخدام الباحث كنوع عام ويمر في اثنين [إينتس] كوسائط يؤدي منشئ "غير صحيح" ليتم استدعاؤها (من وجهة نظري).

ومنها مثلا. Houses<int> houses = new Houses<int>(1,2) - يدعو دالة البناء 2ND. سوف تمر في أي عدد آخر من [إينتس] إلى المنشئ استدعاء منشئ 1ST.

هل هناك أي وسيلة للتغلب على هذه البعض من إزالة الكلمة بارامس وإجبار المستخدمين لتمرير مجموعة من T عند استخدام منشئ الأول؟

هل كانت مفيدة؟

المحلول

وهناك حل أكثر وضوحا سيكون لديك طريقتين مصنع ثابتة. إذا وضعت هذه في فئة nongeneric، يمكنك أيضا الاستفادة من نوع الاستدلال:

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);

وثم منشئ نوع عام الخاص بك لا يحتاج "بارامس" قليلا، وسوف يكون هناك أي التباس.

نصائح أخرى

وربما بدلا من بارامس يمكن أن تمرر في IEnumerable

public Houses(IEnumerable<T> InitialiseElements){}

ومنشئ 2ND هو أكثر <م> بالضبط مباراة، وهو المعايير المستخدمة لتقييم ومنشئ هو الصحيح.

ونظرا ليلي منذ الأصلي لم يكن لديك الكثير من المعلومات على الطبقة الخ.

والمترجم سوف يقرر مجلس النواب الجديد (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
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top