问题一:
class Program
{
static void Main(string[] args)
{
Console.WriteLine((new A()).x);
Console.WriteLine((new A()).y);
Console.Read();
}
}
class A
{
public int x;
public int y = (new A()).x + 1;
}
编译没问题,运行的时候提示 堆栈溢出,可能存在无限递归!
我知道问题出在 public int y = (new A()).x + 1这句赋值上面,但是不能理解
请大虾详细指点
问题二:关于自定义隐式转换的问题
using System ;
class Test
{
static void Main()
{
a=123456;
string b=a;
System.Console.WriteLine(b);
}
public static implicit operator string( int a)
{
return a.ToString();
}
}
编译总提示:用户定义的转换必须是转换成封闭类型,或者从封闭类型转换
看不懂那是什么意思!
请大大虾指点,顺便帮我补一补自定义转换的两个关键字implicit和explicit的用法
public int x; 你的写 x 没有赋初值吧,你写个int x = 0; 试试看
数值a是不可以直接赋值给字符串类型b的。你要用转换才行。比如string b = Convert.ToString(b);
或者string a = (string)b;
explicit 和 implicit 属于转换运算符,如用这两者可以让我们自定义的类型支持相互交换
explicti 表示显式转换,如从 A -> B 必须进行强制类型转换(B = (B)A)
implicit 表示隐式转换,如从 B -> A 只需直接赋值(A = B)
这 public int y = (new A()).x + 1句话好玩,在定义一个变量的时候去调用后于他执行的构造函数然后再进行赋值操作。这句话说着拗口,但如果进行拆分,这里应该有:
public int y = (new A()).x + 1这句话是定义一个整型变量y,同时需要给这个整型变量y进行赋值。我认为问题也就出在赋值上,在class A执行的顺序上,public int y的定义和赋值都是先于public A(){}这个默认构造函数执行,也就是说程序流程执行到给y进行赋值操作时new A()还并未实际的执行到public A(){}这个默认构造函数,也就是此时还未产生A的对象实例(new A())。
因此这里就好玩啦,这里的写法就相当于是在程序还未执行到class A的默认构造函数的时候再继续的去调用class A的默认构造函数--可以理解为在产生A的对象实例前继续调用产生A的对象实例的过程。
如此往复,直到你看到的错误提示....
只是如你所说,这个编译可以通过,我觉得编译当然是没问题的,因为编译他只针对语法、类型安全性等等进行检查进而编译处理等等...编译的过程不等于程序执行过程的本身.
第一个问题很明显,new A()势必要调用y = (new A()).x + 1,很明显的无穷递归。
第二个问题, 简单的说在Test里面只能定义从Test转换为其他类型或从其他类型转换为Test的运算符重载。