class Program
{
public static int i = 0;
public static void Main()
{
(i++).Print();
}
}
static class Extensions
{
public static void Print(this int i)
{
Console.WriteLine(Program.i);
Console.WriteLine(i);
}
}
输出:1 0
为什么当我们只传递i
时,它不会递增,而Program.i
会递增?
答案 0 :(得分:1)
首先,请注意,这与扩展方法无关。
Main()中的代码与此相同:
x & y %in% c(3,4)
这也会打印1和0。
为什么会发生这种情况的答案现在更加明确:
public static void Main()
{
Extensions.Print(Program.i++);
}
,0的当前值,准备将其传递给i
。Print()
的值递增,现在它的值为1. Program.i
。值调用Print()
打印i
,从而打印1。Program.i
,从而打印0。实际上,C#编译器将按如下方式编译i
:
Main()
或(在IL中):
public static void Main()
{
int num = Program.i;
Program.i = num + 1;
num.Print();
}
编译器执行此操作的原因是由于增量后运算符的定义。
根据定义, .method public hidebysig static void Main () cil managed
{
.entrypoint
IL_0000: nop
IL_0001: ldsfld int32 Demo.Program::i
IL_0006: dup
IL_0007: ldc.i4.1
IL_0008: add
IL_0009: stsfld int32 Demo.Program::i
IL_000e: call void Demo.Extensions::Print(int32)
IL_0013: nop
IL_0014: ret
}
必须使用Extensions.Print(Program.i++)
的值进行调用,因为它是在增加之前的。{/ p>
答案 1 :(得分:1)
实际上,在i
方法调用(后缀增量操作,请参阅++ Operator)后,您的Print()
增量,这就是您的输出为' 0',您需要在调用Print()
(前缀增量操作)之前递增它:
(++i).Print();
Console.WriteLine(i);
。
如果您在循环中调用它,可以检查它,例如:
public static void Main()
{
for (int a = 0; a < 10; a++)
{
(i++).Print();
}
}
static class Extensions
{
public static void Print(this string i)
{
Console.WriteLine(i);
}
}
你会得到输出:
输出:0 1 2 3 4 5 6 7 8 9
但如果您在i
方法调用之前增加Print()
,结果将为:
输出:1 2 3 4 5 6 7 8 9 10
并且您的Program.i
获得1,因为其调用是在Print()
方法内进行的,并且在该点Program
&#39; s i
将会增加。
答案 2 :(得分:0)
您的输出为0,因为它在递增程序变量之前执行该方法。
这是如何将1作为输出^^
class Program
{
public static int i = 0;
static void Main(string[] args)
{
i++;
i.Print();
}
}
static class Extensions
{
public static void Print(this int i)
{
Console.WriteLine(Program.i);
Console.WriteLine(i);
}
}
答案 3 :(得分:0)
这是因为您正在使用修复后增量,这意味着在执行print方法后该值会增加
class Program
{
public static int i = 0;
public static void Main()
{
(i++).Print();// increment after print
(++i).Print();// print after increment
}
}
static class Extensions
{
public static void Print(this int i)
{
Console.WriteLine(i);
}
}
out put
0
2