Warum funktioniert das Returns((string food) => eat(food))
während dies nicht funktioniert: Returns(food => eat(food))
?Warum benötigt Moq manchmal explizite Typdeklaration in Rückgabe?
Vollarbeitsbeispiel:
class Program
{
static void Main(string[] args)
{
var animal = new Mock<IAnimal>();
Func<string, string> eat = food => $"Nom nom nom {food}";
// works
animal.Setup(a => a.Eat(It.IsAny<string>())).Returns(eat);
// works
animal.Setup(a => a.Eat(It.IsAny<string>())).Returns((string food) => eat(food));
//cannot convert lambda expression to type 'string' because it is not a delegate type
animal.Setup(a => a.Eat(It.IsAny<string>())).Returns(food => eat(food));
//cannot convert lambda expression to type 'string' because it is not a delegate type
animal.Setup(a => a.Eat(It.IsAny<string>())).Returns(food => $"Nom nom nom {food}");
}
}
public interface IAnimal
{
string Eat(string food);
}
Es ist nicht Moq, die dies erfordert, es ist der C# -Compiler. Es ist wahrscheinlich, dass die große Anzahl von Überladungen der '.Returns'-Methode (18 bei meiner Zählung) dem Compiler zu viele Optionen gibt. Wenn Code in Zukunft nicht funktioniert (wie in, kompiliert nicht), dann postet bitte die eigentliche Fehlermeldung. In diesem Fall ist es "Kann Lambda-Ausdruck nicht in den Typ 'string' konvertieren, da es sich nicht um einen Delegattyp handelt". –
@ LasseV.Karlsen Um fair zu sein, ist der Fehler in Code-Kommentare eingebettet, obwohl ich zustimme, dass es offensichtlicher sein sollte. – DavidG
@ LasseV.Karlsen Ich bekomme das, aber ich habe nur dieses Verhalten in der Moq Returns-Funktion bemerkt, und ich bin gespannt, was den Compiler in der Suche nach der richtigen Methode zum Aufrufen auslöst. Ich erwarte, dass es einen Konflikt mit einigen anderen Methoden in Returns gibt, aber welche? –