【问题标题】:Assign a value to an explicitly-implemented readonly interface property in a constructor在构造函数中为显式实现的只读接口属性赋值
【发布时间】:2017-11-11 20:07:03
【问题描述】:

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

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

例如:

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; 
    }
}

【问题讨论】:

  • 我认为你可以将属性实现为string IPerson.Name { get; private set; } 编辑:经过测试,结果我错了。
  • @itsme86 不幸的是,您不能使用显式接口实现 - IPerson.Name。如果他不使用对IPerson 的显式引用,他可以,但有时由于名称重复/冲突,您需要显式调用

标签: c# .net c#-7.0


【解决方案1】:

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

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

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

但这并没有直接解决您的问题:有一种方法可以从构造函数中设置接口显式属性。虽然有一个建议可能在未来解决这个问题,但不能保证。

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

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

但是,上面的链接只是 GitHub 上 C# 语言存储库上的一个讨论主题。我还没有(还)被语言团队“拥护”,这是迈向它的第一步,甚至被认为是一个新功能。所以很有可能这永远不会被添加到语言中(但有时事情会挑战可能性,所以永远不要说永远......)

【讨论】:

  • 是否有任何文档或讨论解释为什么 C# 编译器在显式实现该属性时不允许在构造函数中使用只读自动属性?
【解决方案2】:

不,您仍然需要在 C# 7 中使用相同的解决方法。如果您指的是表达式主体成员被扩展到构造函数,它不会产生任何解除此限制的效果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-25
    • 2017-03-17
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多