属性构造函数不能使用 console.writeline

Attribute constructor can't use console.writeline

所以我很好奇如果我将 CallerMemberName 属性应用于属性的构造函数的参数会发生什么。这是我非常简单的代码。

class MyAttribute : Attribute
{
    public MyAttribute(string message, [CallerMemberName] string name = "none specified")
    {
        Console.WriteLine("\{message}: \{name}");
    }
}
[My("Program")]
class Program
{
    [My("Main")]
    static void Main(string[] args)
    {
        var MyAttribute = new MyAttribute("Inner");
        Console.ReadLine();
    }
}

我运行 代码但没有任何反应。所以我在构造函数中放置了一个断点,看看它是否会被击中。确实如此。然而,即使 Writeline 调用似乎正在执行,也没有显示任何内容。为什么不呢?

此外,[My("Program")] 属性的断点未命中。为什么不呢?

编辑: 根据 SLaks 的回答,有一个竞争条件可能对程序是致命的。 我将构造函数的内部更改为:

new Thread(() =>
{
    Thread.Sleep(1000);
    Console.WriteLine("\{message}: \{name}");
}).Start();

Main 和 Inner 属性会以这种方式打印,但 Program 属性不会。这是为什么?

这是 CLR 加载程序中的错误。

如果您 运行 启用了 VS 托管进程并在应用于 Main() 函数的属性的构造函数中调用 Console.WriteLine(),或者 (IIRC) class 包含它,您将在 Console 中触发重入竞争条件,并且 Console 将在该程序的生命周期内被完全破坏。

不要那样做。