Betrachten Sie das folgende Beispiel:Erfolgt die Typrückgabe von rechts nach links?
public class Person
{
public int Age { get; set; }
}
public class Builder<TSource>
{
public Builder<TSource> WithValue<TValue>(Func<TSource, TValue>, TValue value)
{
// ...
}
}
Diese beiden Linien arbeiten und laufen gerade fein:
Builder<Person> builder = new Builder<Person>();
builder.WithValue(p => p.Age, 20);
Aber so diese tun:
Builder<Person> builder = new Builder<Person>();
object age = "20"; // <-- string value
builder.WithValue(p => p.Age, age);
Typ-Inferenz nicht die Art und Weise arbeitet I erwarte es am letzten Beispiel zu arbeiten.
Wenn ich einen Ausdruck p => p.Age
angeben, der Func<Person, int>
ist, erwarte ich, dass das zweite Argument auf einen int
-Typ beschränkt ist. Dennoch bin ich in der Lage, eine object
gut zu übergeben.
Ich vermute, das liegt daran, dass Typ Rückschluss von rechts nach links gemacht wird. Das heißt, Argument wird als object
und dann meine Func<TSource, TValue>
Ausdruck wird auf eine Func<Person, object>
beschränkt, die p => p.Age
erfüllt nur gut.
Ist meine Annahme richtig?
Wenn ja, warum wird Typinferenz auf diese Weise durchgeführt? Ich finde es natürlicher von links nach rechts.
Ist nicht der am weitesten abgeleitete Typ 'int'? –
@MatiasCicero Der Typ 'int' erfüllt nicht beide Bedingungen; es erfüllt nur eine der beiden Bedingungen, da Sie ein 'Objekt' in einer Variablen vom Typ 'int' nicht speichern können. – Servy
Ich glaube, ich verstehe es jetzt. Danke für die schnelle Antwort! –