Mono C#奇怪的控制台颜色

4
我有这个“控制台”艺术函数,
public static void Ask(string message)
{
    ConsoleColor previousColor = Console.ForegroundColor;
    Console.ForegroundColor = ConsoleColor.White;
    Console.Write (message);
    Console.Write (" : ");
    Console.ForegroundColor = previousColor;
}

这是我的 Main() 函数

Console.WriteLine("Hello World");
Ask("Roll No");

两个打印出来的白色颜色并不相同,如下图所示。

Screenshot

在调试器中,我可以看到previousColor也是ConsoleColor.White

这并不罕见(您可以通过xterm和rxvt获得相同的效果)。 - Thomas Dickey
1个回答

3

这是一个偶尔会引起混淆的领域。把它称为限制而不是错误。

有两个相关因素:

  1. 大多数实现X中颜色的终端都像自1990年代中期以来xterm和rxvt所做的那样:终端最初可以指定默认前景色和背景色,并且稍后添加了ANSI(和扩展)颜色。与Linux控制台不同,不能保证默认和ANSI颜色相关联。

    VTE(Terminal的功能部分)遵循了该设计,Konsole也是如此。

    从xterm的手册描述的reverseVideo引用显示出ANSI颜色和终端使用的默认颜色之间存在区别:

               其他控制序列可以更改使用的前景色和背景色:
o 程序还可以使用ANSI颜色控制序列设置前景色和背景色。
o 扩展到ANSI颜色控件(例如16、88或256种颜色)类似于ANSI控件。
o 使用其他控制序列(“动态颜色”功能),程序可以更改前景色和背景色。
  1. Mono Console的编写是为了模仿(在某些部分上,适应块)ncurses。 ncurses FAQNcurses resets my colors to white/black指出ncurses假定默认颜色为白色背景黑色 - Console也遵循该设计。

    它可以更进一步地遵循ncurses,以更加意识到通过告诉终端绘制白色文本来实现的显式“白色”与隐式“白色”(通过将颜色重置为其默认值)之间的区别。


1
我最近从Windows上的.NET转移到了Ubuntu上的Mono。感谢您的解释! - Karthik Nishanth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接