【发布时间】:2018-12-13 10:00:25
【问题描述】:
我已经为我的一些项目实现了Option 类型,如下所示:
public abstract Option<T> {}
public class None<T> : Option<T>
public class Some<T> : Option<T>
{
public T Value { get; }
public Some(T value)
{
Value = value;
}
}
为了找出一个选项是否包含一个值,我使用了这个利用模式匹配的扩展方法:
public static bool TryGetValue<T>(this Option<T> option, out T value)
{
if (option is Some<T> some)
{
value = some.Value;
return true;
}
value = default;
return false;
}
我现在收到return default; 的以下警告
无法将 null 文字转换为不可为 null 的引用或不受约束的类型参数
我无法将泛型参数T 限制为class 或struct。
例如,如果我将泛型参数限制为class,我无法生成Option<int?> 实例,因为Nullable<int> 类型本身就是struct。通过后缀? 将 out 参数声明为可为空也不是一个解决方案。
在我看来,类型系统在这个阶段有些破损或没有经过彻底考虑。 Nullable 应该是 class 或者需要有一个通用参数限制,例如:
public static bool TryGetValue<T>(this Option<T> option, out T value)
where T : nullable [...]
是否有其他方法可能适合此问题?我错过了什么?
【问题讨论】:
-
我认为你应该看看这个youtube.com/watch?v=F9bznonKc64Mark Seemann 谈论单子。在此之后,您停止尝试从 monad 中获取价值。 :)
-
不管怎样,我想知道不可为空的引用类型的默认值是什么
-
好吧,我复制了你的代码,它没有提示你的警告。对不起,我帮不了你。你用VS2019吗?
-
为什么不在抽象类上添加一个抽象的
Value属性,在None<T>的情况下通过返回默认值来实现它,在Some<T>上通过返回它的值来实现它?
标签: c# c#-8.0 nullable-reference-types