【发布时间】:2020-09-11 14:56:32
【问题描述】:
private struct Maybe<T>
{
private readonly T value;
private readonly bool hasValue;
private Maybe(T value)
{
this.value = value;
hasValue = true;
}
public static implicit operator Maybe<T>(T value) =>
value == null ? new Maybe<T>() : new Maybe<T>(value);
}
private static Maybe<byte> OK()
{
return 5;
}
private static Maybe<IEnumerable<byte>> NotOK()
{
var e = new[] { 1, 2, 3 }.Select(x => (byte)x);
Console.WriteLine(e.GetType().Name);
return e;
}
小提琴(不要使用):https://dotnetfiddle.net/NxAw9l
更新小提琴:https://dotnetfiddle.net/NrARTl
某些泛型类型在上述代码中的隐式转换失败。请参阅 Ok() 和 NotOk() 函数调用和返回类型。一个复杂的泛型类型失败了,我不明白为什么。我已经从返回类型为IEnumerable<IEnumerable<T>> 的函数中简化了这一点。这个IEnumerable<T> 仍然失败。我想如果我能理解为什么会失败,我想我也会解决真正的问题。感谢您的帮助和时间。
如果您愿意,这里是错误消息:
Error CS0029 Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<byte>' to 'Maybe<System.Collections.Generic.IEnumerable<byte>>'
更新: 从 NotOK() 返回 Byte[] 不起作用,因为在我的真实源代码中,我有一个 LINQ 查询,我必须依赖它的延迟延迟执行(即它有严格返回 IEnumerable)(参见相同答案 => https://stackoverflow.com/a/63880804/5917087)。
【问题讨论】:
-
你的意思是让你的 dotnetfiddle 网络核心?因为作为net4.7.2的错误是完全不同的
-
我没有说实话。我只是把它放在那里帮助别人加快速度。我将 C# 6.0 与 .NET 4.8 一起使用。
-
你可能应该 ifx 小提琴所以它显示相同的错误然后
-
当我打开链接时,它会为我显示 4.7.2。
-
如果你尝试运行它会发生什么?我得到
Compilation error (line 16, col 53): ; expected
标签: c# type-inference