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).
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. –
@ 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. –
@ 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. –