Perché il Type.GetProperty(string)
non ottiene una proprietà da un'interfaccia di base se il tipo è un'interfaccia? Ad esempio, il codice seguente stampa:Perché C# Type.GetProperty() si comporta in modo diverso per le interfacce rispetto alle classi base?
System.String X
null
System.String X
System.String X
che sembra incoerente:
void Main()
{
Console.WriteLine(typeof(I1).GetProperty("X"));
Console.WriteLine(typeof(I2).GetProperty("X"));
Console.WriteLine(typeof(C1).GetProperty("X"));
Console.WriteLine(typeof(C2).GetProperty("X"));;
}
public interface I1 { string X { get; } }
public interface I2 : I1 { }
public class C1 { public string X { get { return "x"; } } }
public class C2 : C1 { }
EDIT: un altro aspetto del runtime che supporta la risposta di Cole è la seguente:
public class C : I2 {
// not allowed: the error is
// 'I2.X' in explicit interface declaration is not a member of interface
string I2.X { get; set; }
// allowed
string I1.X { get; set; }
}
Non ha nulla a che fare con la classe o l'interfaccia. X è privato in uno e pubblico nell'altro. –
Le interfacce possono essere implementate esplicitamente ('nascondere' i metodi sulla classe di implementazione), mentre le proprietà pubbliche su una classe sono sempre visibili. Vedrete lo stesso comportamento se implementate esplicitamente I1 su C1, mentre se lo implementate implicitamente, GetProperty lo troverà. –
@CoryNelson tutte le proprietà dell'interfaccia sono pubbliche. O stai dicendo che I2 implementa esplicitamente I1 e quindi i suoi metodi I1 sono privati? Se è vero, allora perché puoi accedere a X tramite un'istanza di I2 senza cast? – ChaseMedallion