【发布时间】:2015-06-05 17:46:33
【问题描述】:
使用自动属性实现显式接口was not possible in C# 5,但现在C# 6 支持getter-only auto-properties,现在应该可以了,对吧?
在 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 的原始问题。在我的真实场景中,值来自注入构造函数的对象。如果属性返回的值可以在初始化时设置,answer by Daniel A. White 非常好。
上面写着:
无法将属性或索引器“IFoo.TestFoo”分配给 -- 它是只读的。
有没有办法解决这个问题,还是我仍然需要在这种情况下使用带有支持字段的属性?
我正在使用带有 DNX451 1.0.0-beta4 的 Visual Studio 2015 RC 和 Visual Studio Code 0.3.0。
我有raised an issue over at the Roslyn GitHub page。
possible duplicate 是关于定义具有可读取常规属性的接口的问题。我的问题是关于使用新的 C# 6 功能显式实现这样的接口,理论上,这应该可以实现。请参阅我在第一句中链接的另一个问题以获得类似的问题(但对于 C# 5,其中仅 getter 的自动属性尚不可用)。
【问题讨论】:
-
我猜它只是一个错误,或者编译器无法确定它是可设置的,因为它位于只读接口后面。
-
@DanielA.White 这与普通属性没有太大区别。
string Foo { get; }现在是合法的,尽管在这种情况下你可以在构造函数中设置它。 -
@DanielA.White,是的。我猜编译器只允许从构造函数直接访问属性,并且不允许强制转换。
-
@mikez 有演员参与。
-
@Powerlord,链接问题中的人对接口定义感到困惑(他/她认为这是一个仅限 getter 的属性定义)。我的问题是关于是否可以使用新的 C# 6 功能来显式实现接口。