Это не имеет ничего общего с делегатами, и все, что связано с тем, что по умолчанию все аргументы передаются по значению. Вы бы видели такое же поведение, если бы factory
было int
, или string
, или StringBuilder
.
Если вы хотите, чтобы ваш конструктор Service
изменил значение аргумента, вам нужен параметр ref
или out
. Однако я бы лично предложил вам изменить его на метод, который возвращает a Func<string>
:
public class Caller
{
private readonly Func<string> factory;
public Caller()
{
this.factory = Service.GetFunc();
}
}
public class Service
{
public static Func<string> GetFunc()
{
return () => Guid.NewGuid().ToString();
}
}
(Здесь есть и другие варианты, такие как преобразование группы методов или свойство. Трудно понять, что порекомендовать, когда у нас мало контекста.)
Очевидно, вы захотите переименовать метод. Но вызов конструктора исключительно для изменения параметра out
был бы очень странным кусочком кода.
Подробнее о передаче параметров см. Мою статью на тему .