存储 Func<T> 代表

Store Func<T> delegates

我遇到了一个问题。我发现没有从 Func<int>Func<object> 的隐式转换,尤其是从通用 Func<T> 的隐式转换。我有点理解为什么没有转换。但我仍然需要存储如下任何函数:

static Dictionary<int, Func<int, object>> funcs = new Dictionary<int, Func<int, object>>();
public static void SetFunction<T>(Func<int, T> f)
{
    funcs[42] = f;
}

public static void Main()
{
    SetFunction(x => 42);
    SetFunction(x => "42");
    SetFunction(x => Guid.NewGuid());
}

有什么方法可以存储这些函数吗?我不想使用 dynamic。 我还需要保留原来的功能。多次调用它们。

无论如何你都不能使用 dynamic,这不是它的用途。与其考虑转换,不如在你的函数中添加另一层:

public static void SetFunction<T>(Func<T> f)
{
    funcs[42] = () => (object)f();
}

您或许可以完全避免使用泛型。

static Dictionary<int, Func<object>> funcs = new Dictionary<int, Func<object>>();

public static void SetFunction(Func<object> f)
{
    funcs[42] = f;
}

public static void Main()
{
    SetFunction(() => 42);
    SetFunction(() => "42");
    SetFunction(() => Guid.NewGuid());
}

我根据你的答案构建了一个答案。尤其是盲人的。 我需要一些推理,但你对我的启发足以构建它。

static Dictionary<int, Func<object>> funcs = new Dictionary<int, Func<object>>();
static Random rnd = new Random();
public static void SetFunction<T>(int index, Func<Random, T> f)
{
    funcs[index] = () => (object)f(rnd);
}

public static void Main()
{
    SetFunction(41, x => x.NextDouble());
    SetFunction(42, x => x.Next());
    SetFunction(43, _ => "HW");
    Console.WriteLine(funcs[41]());
    Console.WriteLine(funcs[41]());
    Console.WriteLine(funcs[42]());
    Console.WriteLine(funcs[42]());
    Console.WriteLine(funcs[43]());
    Console.WriteLine(funcs[43]());
}

输出:

0.6657498062894446
0.5739200415899605
1762534382
1301357548
HW
HW