今天,我试图将我的头围绕在彼此引用的不可变对象上.我得出的结论是,如果不使用惰性评估,你不可能做到这一点,但在这个过程中我写了这个(在我看来)有趣的代码.
public class A
{
    public string Name { get; private set; }
    public B B { get; private set; }
    public A()
    {
        B = new B(this);
        Name = "test";
    }
}
public class B
{
    public A A { get; private set; }
    public B(A a)
    {
        //a.Name is null
        A = a;
    }
}
我觉得有趣的是,我想不出另一种在尚未完全构造且包含线程的状态下观察A类对象的方法.为什么这甚至有效?有没有其他方法来观察未完全构造的物体的状态?
这合法吗?它是否包含隐藏的错误或缺陷?Visual Studio不会给出任何错误或警告,但ReSharper会:
/// <summary>
/// immutable tuple for two
/// </summary>
public class Pair<TValue1, TValue2> : Singleton<TValue1>
{
    public TValue2 Value2 { get; private set; }
    public Pair(TValue1 value1, TValue2 value2, Func<Pair<TValue1, TValue2>, String> toStringFunc)
        : this(value1, value2, () => toStringFunc(this)) { } //Red light
}2> : Singleton<TValue1>
使用此Blazor组件:
@page "/counter"
<h1>Counter</h1>
<p>Current count: @_a.CurrentCount</p>
<button class="btn btn-primary" onclick="@_b.IncrementCount">Click me</button>
@functions {
    private readonly ClassA _a = new ClassA();
    private readonly ClassB _b = new ClassB(_a);
    class ClassA
    {
        public int CurrentCount { get; set; }
    }
    class ClassB
    {
        private readonly ClassA _classA;
        public ClassB(ClassA classA)
        {
            _classA = classA;
        }
        public void IncrementCount() => _classA.CurrentCount++;
    }
}
我收到此错误:
错误CS0236字段初始值设定项无法引用非静态字段,方法或属性'__Counter._a'
此线程说明如何解决标准类中的此错误:
但是为此,它需要一个构造函数。
是否可以在Blazor组件中添加构造函数?
如何解决此错误?