为什么基类对象无法在Generics基类约束中提供其成员函数和成员

时间:2015-08-07 08:12:20

标签: c# generics

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
namespace Rextester
{
    public class PhoneNumber 
    {
        public  PhoneNumber()
        {
        }
            public  PhoneNumber(string n, string num) 
        {
            Member = new Dictionary<string, string>();
            Member.Add(n,num);          
        }

        public void Add(string n, string num)
        {
            Member = new Dictionary<string, string>();
            Member.Add(n,num);
        }
        public Dictionary<string,string> Member { get; set; }

    }
    class FriendsPhoneNumbers : PhoneNumber 
    {
        public FriendsPhoneNumbers (){}
        public FriendsPhoneNumbers (string n, string num, bool wk) :
        base(n, num)
        {
            IsWorkNumber = wk;
        }
        public bool IsWorkNumber { get; private set; }
    }
    class PhoneList<T> where T : PhoneNumber
    {
        T[] phList;
        int end;
        public PhoneList()
        {
            phList = new T[10];
            end = 0;
        }
        public bool Add(T newEntry)
        {
            if(end == 10) return false;
            phList[end] = newEntry;
            end++;
            return true;
        }
    }
    public class Program
    {
        public static void Main(string[] args)
        {

            PhoneNumber pnm=new PhoneNumber("Hii","123");
            pnm.Add("Hello","456");
            Console.WriteLine("pnm count: "+pnm.Member.Count);
            foreach(KeyValuePair<string,string> k in pnm.Member)
            {
                Console.WriteLine(k.Key+": "+k.Value);  
            }

            PhoneList<PhoneNumber> p2=new PhoneList<PhoneNumber>();
            p2.Add(new PhoneNumber("Hii!","789"));
            p2.Add(new PhoneNumber ("Hello","4565"));
            foreach(KeyValuePair<string,string> k in p2.Member)
            {
                Console.WriteLine(k.Key+": "+k.Value);  
            }
        }
    }
}
  1. 错误:PHONELIST&#39;不包含&#39;会员&#39;的定义没有推广方法&#39;会员&#39; 接受PhoneList类型的第一个参数&#39; 可以找到(你错过了使用指令或汇编引用吗?)

  2. 属性字典&#34;成员=新词典()&#34;可以在课堂上宣布&#34; Phonenumber&#34;这样两个&#34;添加&#34;类中的方法和构造函数使用它并在Main方法中给出pnm.count值= 2。

1 个答案:

答案 0 :(得分:0)

p2是PhoneList

PhoneList<PhoneNumber> p2=new PhoneList<PhoneNumber>();

PhoneList没有成员属性,所以:

foreach(KeyValuePair<string,string> k in p2.Member)

没有任何意义,并且非常正确地抛出错误。我想你希望PhoneList继承Collection,因为它是一个带有一些Add逻辑的自定义集合,这正是Collection的用途。那么你将有一个课程,你可以实现拉回物品,然后你可以要求他们的Memeber财产。

所以它看起来像这样:

public class PhoneList<T> : Collection<T> where T : PhoneNumber
{
    protected override void InsertItem(int index, T item)
    {
        if (this.Count() < 10)
        {
            base.InsertItem(index, item);       
        }
    }
}

它不会返回true,但您永远不会在代码中使用返回值。然后你可以这样写:

        foreach(var k in p2.SelectMany(x => x.Member))
        {
            Console.WriteLine(k.Key+": "+k.Value);  
        }

这会给你所有数字。

至于你的初始化成员,你可能想要这样做:

public class PhoneNumber 
{
    public  PhoneNumber()
    {
         Member = new Dictionary<string, string>();
    }

    public  PhoneNumber(string n, string num) : this()
    {            
        Member.Add(n,num);          
    }

    public void Add(string n, string num)
    {
        Member = new Dictionary<string, string>();
        Member.Add(n,num);
    }

    public Dictionary<string,string> Member { get; private set; }

}

无论你调用什么构造函数,它总是被初始化,并且可以从类外部重置。你会得到计数:

pnm.Members.Count;