存储 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
我遇到了一个问题。我发现没有从 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