C# 如何根据访问修饰符组合属性init和set?

C# 如何根据访问修饰符组合属性init和set?,c#,c#-9.0,C#,C# 9.0,我想要一个具有保护集和公共init访问限制的类/记录? 据我所知,这甚至不能通过显式实现如下“Set”接口来实现: public interface ISetData<T> { T Value { get; set; } } public class Data : ISetData<bool> { bool ISetData<bool>.Value { get => Value;

我想要一个具有保护集和公共init访问限制的类/记录? 据我所知,这甚至不能通过显式实现如下“Set”接口来实现:

    public interface ISetData<T>
    {
        T Value { get; set; }
    }

    public class Data : ISetData<bool>
    {
        bool ISetData<bool>.Value { get => Value; set => Value = value; } // Error The property Value has no setter

        public bool Value { get; init; }
    }
我知道最好通过一个功能请求来解决这个问题,但这不是本文的主题


那么对于“public init,但是受保护的set”场景有哪些解决方案呢?

一个简单的答案是none


在C#9.0中,您可以拥有
init
受保护集
,而不是两者都有。

您可以拥有一个单独的受保护属性集,然后公共属性可以基于您的受保护属性。下面的例子

使用系统;
公共课程
{
公共静态void Main()
{
var example=新示例{Test=“hello world”};
例如,PrintProtectedTest();
Console.WriteLine(示例.Test);
示例.SetProtectedTest(“再见世界”);
Console.WriteLine(示例.Test);
}
}
课例
{
公共示例()
{
}
受保护字符串ProtectedTest{get;set;}
公共字符串测试
{
get=>ProtectedTest;
init=>ProtectedTest=值;
}
公共void SetProtectedTest(字符串测试)
{
保护测试=测试;
}
public void printedprotectedtest()
{
控制台写入线(受保护测试);
}
}

您可以在这里运行示例

请参见抱歉,现在意识到这只是使用您刚才描述的支持字段的一个微小变化,可能不会增加太多内容。
    public interface ISetData<T>
    {
        T Value { get; set; }
    }

    public class Data : ISetData<bool>
    {
        bool ISetData<bool>.Value { get => Value; set => _value = value; } // Fine

        private bool _value;

        public bool Value
        {
            get { return _value; }
            init { }
        }
    }
    public class Data
    {
        public bool Value { get; init; protected set; }
    }