I naprawdę trzeba mieć coś takiego:Getter i seter pochodzących z różnych interfejsów
interface IReadableVar
{
object Value { get; }
}
interface IWritableVar
{
object Value { set; }
}
interface IReadableWritableVar : IReadableVar, IWritableVar
{
}
Jednak gdy próbuję użyć IReadableWritableVar.Value
otrzymuję błędy kompilacji, chyba że wyraźnie oddane do interfejsu bazowego, jak tutaj:
static void Main()
{
IReadableWritableVar var = null;
var t = var.Value; // <-- CS0229: Ambiguity between 'IReadableVar.Value' and 'IWritableVar.Value'
var.Value = null; // <-- CS0229: Ambiguity between 'IReadableVar.Value' and 'IWritableVar.Value'
var v = ((IReadableVar)var).Value; // compiles fine
((IWritableVar)var).Value = null; // compiles fine
}
Dlaczego pojawiają się te błędy, mimo że wszystko powinno być jasne dla kompilatora? Czy jest jakiś sposób na rozwiązanie tego problemu poza rzutowaniem (setki miejsc w aplikacji)?
Aktualizacja: zasugerowano, że jest to duplikat Implementing 2 Interfaces with 'Same Name' Properties, ale jest to nieco inne, ponieważ w drugim przypadku nie ma dziedziczenia w interfejsach. W każdym razie problem został rozwiązany teraz - patrz zaakceptowana odpowiedź.
myślę kompilator nie jest zaprojektowany, że sposób na odróżnienie identycznych właściwości w różnych interfejsach na podstawie programu pobierającego lub ustawiającego –
Możliwy duplikat opcji [Implementing 2 Interfaces with 'Same Name'] (http://stackoverflow.com/questions/532148/implementing-2-interfaces-with- same-nazwy-własności) – PJvG
Należy zauważyć, że 'IWritableVar' jest podejrzany, ponieważ właściwości tylko do zapisu są podejrzane. Każdy dzwoniący, który może napisać właściwość, powinien prawdopodobnie być w stanie ją odczytać, a tam, gdzie to nie ma sensu, prawdopodobnie potrzebujesz metody, a nie właściwości. –