Использование автоматических свойств для реализации явного интерфейса невозможно в С# 5, но теперь, когда С# 6 поддерживает авто-свойства только для геттера, это должно быть возможно сейчас, правильно?
Создание автоматического свойства завершается успешно на С# 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.
возможный дубликат - это вопрос об определении интерфейса с регулярным свойством, которое можно прочитать. Мой вопрос заключается в том, чтобы реализовать такой интерфейс, явно используя новую функцию С# 6, которая теоретически должна сделать это возможным. См. Другой вопрос, который я связал в первом предложении для аналогичного (но для С# 5, где авто-свойства только для гейтера, если они еще не доступны).