//代码如下:
//我运行的时候报无权限递归,
//发生在cat类的set方法里面,这个成员是public的
//请问是为什么啊?using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
interface Ibark
{
    void bark();
    string name{get;}}internal class Dog : Ibark
{
    string Ibark.name 
    { 
        get 
        {
            return "dog"; 
        } 
    }
  
    void Ibark.bark()
    {
        Console.WriteLine("wang wang!");
    }
}internal class Cat : Ibark
{
    public string catname
    {
        get 
        {
            return catname;
        }        set
        {
            catname = value;
            
        }
    }    string Ibark.name
    {
        get
        {
            return this.catname;
        }
    }
    void Ibark.bark()
    {
        Console.WriteLine("miu,miu!");
    }
}namespace consoleInterface
{
    class Program
    {
        static void Main(string[] args)
        {
                        Dog dog = new Dog();
            
            Ibark bark = dog;
            bark.bark();
            Console.WriteLine("the current obje is  {0}",bark.name);            Cat cat = new Cat();            cat.catname = "tom";
            bark = cat;
            bark.bark();
            Console.WriteLine("the current obje is  {0}", bark.name);            Console.ReadLine();        }
    }
}

解决方案 »

  1.   

    the same ╮(╯_╰)╭如果改成传统的用法,一个public 成员用 get set 操作一个 私有成员然后实现接口的成员 返回这个私有成员 就没问题。为啥用public成员 带get set 就这样递归了呢?
      

  2.   

    我已经知道问题在哪里了class cl
    {
       public string m_s 
       {
          get { return m_s;}
          set { m_s = value;}
       }
    }这样的写法会引发递归。但是
    class cl
    {
       public string m_s 
       {
         get;set;
       }
    }这样却不会。这两种写法有什么区别?以及为什么对属性进行操作会引发递归。
      

  3.   

    public string m_s{get;set;}
    这种语法,编译器会自动为你生成一个_m_s的成员。如果没有特别的需求,用这种写法就可以了。
      

  4.   


    +1
    问题出在Cat类里的这个属性 public string catname
      {
      get  
      {
      return catname;
      }  set
      {
      catname = value;
        
      }
      }
      

  5.   

    而且字段最好用private的,不要用public,封装属性是开闭原则中很重要的一点
      

  6.   

    既然如此,我觉得如果有对 属性进行 set 赋值的写法,编译器提示个错误才对。免得运行时来个自身的递归。
      

  7.   

    这个是编写代码习惯的问题。如果属性名叫Catname,内部成员也叫catname,那么赋值的时候,最好写this.catname=value;就不会写错了。