项目从 .NET 9 升级到 .NET 10 后,下面的代码编译是报错
var items = await ListRankAsync(CacheKeyManager.UserVisitRank(appName, DateTime.Now), skip, take, pattern);
return items.Select(x => new UserVisitCountItem(Guid.Parse(x.Element), (long)x.Score)).ToList();
错误信息如下
The call is ambiguous between the following methods or properties: 'Guid.Parse(ReadOnlySpan<byte>)' and 'Guid.Parse(string)'
x.Element 的类型是 RedisValue
在 .NET 9 及之前,Guid.Parse 只有 string 等少数重载。
.NET 10(预览版或未来版本)引入了 Guid.Parse(ReadOnlySpan<byte>) 以支持更高效的二进制解析。
RedisValue 定义了多个隐式转换运算符:
public static implicit operator string(RedisValue value);
public static implicit operator ReadOnlySpan<byte>(RedisValue value);
就是这个原因,强制转换为 ReadOnlySpan<byte> 就可以了,用下面的代码验证通过
using StackExchange.Redis;
var userId = Guid.NewGuid();
var redisValue = new RedisValue(userId.ToString());
var guid = Guid.Parse((ReadOnlySpan<byte>)redisValue);
Console.WriteLine(guid);
类型推断不出来. 加一个 (bytes[] || string )x.Element. redisvalue 能 implicit 转换到 string 或者bytep[]. Guid.Parse 不知道选哪一个.
C# 不支持这个语法吧 (bytes[] || string )
@dudu: 二选一的意思