Подтвердить что ты не робот

Явная реализация интерфейса, использующего авто-свойство только для getter (функция С# 6)

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

4b9b3361

Ответ 1

Вы можете обойти это, используя поле поддержки только для чтения для вашего явно реализованного свойства. Вы можете назначить введенное значение в поле поддержки внутри конструктора, явное свойство get будет возвращать его.

public class Impl : IFoo
{
    private readonly string _testFoo;

    string IFoo.TestFoo => _testFoo;

    public Impl(string value)
    {
        _testFoo = value;
    }
}

Ответ 2

Я думаю, вы хотите этого

string IFoo.TestFoo { get; } = "World";