为构造函数中显式实现的只读接口属性赋值

时间:2017-06-09 17:51:52

标签: c# .net c#-7.0

同样的问题as this one,但对于C#7.0而不是6.0:

有没有办法在构造函数中为显式实现的只读(getter only)接口属性赋值?或者它仍然是相同的答案,即使用支持领域解决方案?

例如:

interface IPerson
{
    string Name { get; }
}

class MyPerson : IPerson
{
    string IPerson.Name { get; }

    internal MyPerson(string withName)
    {
        // doesn't work; Property or indexer 'IPerson.Name' 
        // cannot be assigned to --it is read only
        ((IPerson)this).Name = withName; 
    }
}

解决方法:

class MyPerson : IPerson
{
    string _name;
    string IPerson.Name { get { return _name; } }

    internal MyPerson(string withName)
    {
        _name = withName; 
    }
}

2 个答案:

答案 0 :(得分:6)

从C#7开始,您可以做的最好的事情是利用表达式身体属性和构造函数来略微简化您的代码:

class MyPerson : IPerson
{
    string _name;
    string IPerson.Name => _name;

    internal MyPerson(string withName) => _name = withName;
}

这并不能直接解决您的问题:有一种从构造函数设置interface-explicit属性的方法。虽然可能将来会解决此问题,但仍有提案,但无法保证。

Proposal: Property-Scoped Fields,建议允许在属性中使用上下文关键字field来引用支持字段,而不必明确定义后者。这可能也会提供以下内容的语法:

string IPerson.Name { get; }
internal MyPerson(string withName) => IPerson.Name.field = withName;

但是,上面的链接只是关于GitHub上C#语言仓库的讨论主题。我还没有(并且)被提升过#34;语言团队,这是它的第一步,甚至被视为一个新功能。所以这种可能性永远不会被添加到语言中(但有时候事情会有所不同,所以永远不要说永远......)

答案 1 :(得分:0)

不,你仍然需要在C#7中使用相同的解决方法。如果你指的是扩展到构造函数的表达式身体成员,它没有任何影响来解除这个限制。