在C# 5中,无法使用自动属性显式实现接口,但是由于C# 6支持getter-only自动属性, 现在应该可以做到了,对吧?
在C# 6中创建自动属性会成功,但是在构造函数中尝试为其赋值时,需要先将this
强制转换为接口类型,因为实现是显式的。但这就是VS 2015 RC和VS Code 0.3.0显示错误的地方,如注释所示:
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
的原始问题。在我的真实场景中,该值来自注入到构造函数中的对象。如果属性返回的值可以在初始化时设置,则Daniel A. White的答案非常好。
它说:
属性或索引器“IFoo.TestFoo”无法分配-只能读取。
有没有办法绕过这个问题,或者我仍然必须为这种情况使用备份字段的属性?
我使用Visual Studio 2015 RC和Visual Studio Code 0.3.0与DNX451 1.0.0-beta4。
我已经在Roslyn GitHub页面上提出了一个问题。
可能的重复问题是关于定义具有可读属性的接口的问题。我的问题是关于使用新的C# 6功能显式实现这样的接口,理论上应该使这成为可能。请参见我在第一句中链接的另一个类似问题(但适用于C# 5,在那里getter-only自动属性尚不可用)。