2015-06-05 10 views
21

Używanie automatycznych właściwości do implementacji jawnego interfejsu was not possible in C# 5, ale teraz, gdy C# 6 obsługuje getter-only auto-properties, powinno to być możliwe teraz, prawda?Wyraźna implementacja interfejsu przy użyciu właściwości automatycznej tylko do pobierania (funkcja C# 6)

Tworzenie właściwości automatycznej kończy się sukcesem w C# 6, ale przy próbie przypisania jej wartości do konstruktora należy najpierw odrzucić this na typ interfejsu, ponieważ implementacja jest jawna. Ale to gdzie zarówno VS 2015 RC i Kodeks VS 0.3.0 Wyświetlacz błąd, który widać w komentarzu:

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); 
     } 
    } 
} 

Uwaga: Po zaktualizowaniu oryginalne pytanie, które ustawić stałą wartość do TestFoo. W moim prawdziwym scenariuszu wartość pochodzi z obiektu, który jest wstrzykiwany do konstruktora. Model answer by Daniel A. White jest doskonały, jeśli wartość zwrócona przez właściwość może zostać ustawiona podczas inicjowania.

Mówi:

nieruchomości lub indekser 'IFoo.TestFoo' nie może być przypisany do - to jest tylko do odczytu.

Czy jest jakiś sposób obejścia tego problemu, czy nadal muszę używać właściwości z polami kopii w tym przypadku?

Używam Visual Studio 2015 RC i Visual Studio Code 0.3.0 z DNX451 1.0.0-beta4.

Mam raised an issue over at the Roslyn GitHub page.


possible duplicate jest pytanie o definicję interfejsu z regularnym nieruchomości, które mogą być odczytywane. Moje pytanie dotyczy implementacji takiego interfejsu jawnie za pomocą nowej funkcji C# 6, która teoretycznie powinna to umożliwić. Zobacz drugie pytanie, które połączyłem w pierwszym zdaniu dla podobnego (ale dla C# 5, gdzie auto-właściwości tylko z samym geterem, gdzie nie są jeszcze dostępne).

+1

Zgaduję, że to tylko błąd lub kompilator nie może dowiedzieć się, że można go ustawić, ponieważ jest za interfejsem, który jest tylko do odczytu. –

+0

@ DanielA.White To niewiele różni się od zwykłej właściwości. 'string Foo {get; } 'jest legalne, ale w takim przypadku możesz ustawić go w konstruktorze. –

+1

@ DanielA.White, tak. Domyślam się, że kompilator zezwala tylko na bezpośredni dostęp do właściwości z konstruktora, a rzutowanie nie jest dozwolone. –

Odpowiedz

3

Można to obejść stosując pole tylko do odczytu poparcie dla swojej wyraźnie realizowanego obiektu. Możesz przypisać wartość wtryskiwaną do pola zaplecza w konstruktorze, implementacja get jawnej właściwości zwróci ją.

public class Impl : IFoo 
{ 
    private readonly string _testFoo; 

    string IFoo.TestFoo => _testFoo; 

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

Myślę, że chcesz to

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

Prawdopodobnie lepiej niż moje 'string IFoo.TestFoo {get; prywatny zestaw; } 'thought; p – leppie

+0

Przepraszam, powinienem był być bardziej przejrzysty: Wartość określona dla' TestFoo' pochodzi z obiektu wstrzykniętego do konstruktora, ale dziękuję. –

+0

@NikontheThird: Czy moja sugestia działa? Nie sądzę, że tak będzie, ale może to być miłe "rozwiązanie syntaktyczne" wyrażające intencje. Może warto byłoby zarejestrować problem na githubie Roslyn. – leppie

Powiązane problemy