【发布时间】:2014-12-03 14:52:23
【问题描述】:
我正在使用 StackExchange.Redis 访问 Redis 实例。
我有以下可用的 C# 代码:
public static void Demo()
{
ConnectionMultiplexer connection = ConnectionMultiplexer.Connect("xxx.redis.cache.windows.net,ssl=true,password=xxx");
IDatabase cache = connection.GetDatabase();
cache.StringSet("key1", "value");
}
这是我希望的等效 F# 代码:
let Demo() =
let cx = ConnectionMultiplexer.Connect @"xxx.redis.cache.windows.net,ssl=true,password=xxx"
let cache = cx.GetDatabase()
cache.StringSet("key1", "value") |> ignore
但是这不能编译 - '没有重载匹配方法 StringSet'。 StringSet 方法需要 RedisKey 和 RedisValue 类型的参数,并且 C# 中似乎有一些编译器魔法将调用代码中的字符串转换为 RedisKey 和 RedisValue。 F# 中似乎不存在这种魔法。有没有办法达到同样的效果?
【问题讨论】:
-
有
RedisKey.op_Implicit和RedisValue.op_Implicit运算符吗? -
@Daniel - 看起来像。如果我导航到定义,我会得到以下 .fsi 生成: type RedisKey = ... static member op_Implicit : key:string -> RedisKey static member op_Implicit : key:byte [] -> RedisKey static member op_Implicit : key:RedisKey -> byte [] 静态成员 op_Implicit : key:RedisKey -> string
-
那么你需要做
StringSet(RedisKey.op_Implicit "key1", RedisValue.op_Implicit "value")。这些是在 C# 中自动调用的,但不是 F#。你也可以define an "implicit" operator。 -
太棒了,看起来这会奏效。如果您将其发布为答案,我会将其标记为这样,并为您提供神奇的互联网积分。谢谢!
-
我会亲自扩展字符串以拥有 toRedisKey 和 toRedisVal 的乐趣。更具可读性、可控性和清晰性。对 RedisKey 执行相同的操作以转换为字符串或其他任何内容。