首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用getter专用的自动属性(C# 6特性)显式实现接口

使用getter专用的自动属性(C# 6特性)显式实现接口
EN

Stack Overflow用户
提问于 2015-06-05 17:46:33
回答 2查看 1.9K关注 0票数 21

将自动属性用于显式接口实现在C# 5中不可能,但是现在C# 6支持只适用于自动属性,这应该是可能的,对吗?

在C# 6中创建自动属性是成功的,但是当尝试在构造函数中为其赋值时,必须首先将this转换为接口类型,因为实现是显式的。但是,VS 2015 RC和VS Code0.3.0都显示了注释中可以看到的错误:

代码语言:javascript
运行
复制
using static System.Console;

namespace ConsoleApp
{
    public interface IFoo { string TestFoo { get; } }

    public class Impl : IFoo
    {
        // This was not possible before, but now works.
        string IFoo.TestFoo { get; }

        public Impl(string value)
        {
            // ERROR: Property or indexer 'IFoo.TestFoo' cannot be assigned to -- it is read only.
            ((IFoo)this).TestFoo = value;
        }
    }

    public class Program
    {
        // Yes, not static. DNX supports that (for constructor DI).
        public void Main(string[] args)
        {
            IFoo foo = new Impl("World");

            WriteLine($"Hello {foo.TestFoo}");
            ReadKey(true);
        }
    }
}

注意:我更新了将常量设置为TestFoo**. 的原始问题。在我的实际场景中,值来自注入构造函数的对象。如果属性返回的值可以在初始化时设置,则[答案由DanielA.White](https://stackoverflow.com/a/30672805/1565070)是非常优秀的。

上面写着:

属性或索引器'IFoo.TestFoo‘不能分配给--它是只读的。

有办法解决这个问题吗,还是必须在这种情况下使用带有支持字段的属性?

我使用VisualStudio2015RC和VisualStudioCode0.3.0和DNX451 1.0.0-beta4。

我有在罗斯林GitHub页面上提出了一个问题.

可能重复是一个关于具有可读取的常规属性的接口的定义的问题。我的问题是如何使用一个新的C# 6特性显式地实现这样一个接口,从理论上讲,这应该是可能的。请参阅我在第一句中链接到的另一个类似的问题(但是对于C# 5,只有getter的汽车属性还没有)。

EN

Stack Overflow用户

回答已采纳

发布于 2016-12-02 03:47:54

您可以通过为显式实现的属性使用只读备份字段来解决这一问题。您可以将注入的值分配给构造函数中的支持字段,显式属性的get实现将返回它。

代码语言:javascript
运行
复制
public class Impl : IFoo
{
    private readonly string _testFoo;

    string IFoo.TestFoo => _testFoo;

    public Impl(string value)
    {
        _testFoo = value;
    }
}
票数 4
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30672761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档