我目前正在创建一个struct Nullsafe<T>将包装引用类型(因此T:class)并以与Nullable<T> struct. 关键是模仿Option<T>F# 中的功能。
我打算在需要特别注意空值的方法中使用类型。例如,假设我有一个引用类型class Foo和以下代码:
class Bar
{
public void DoSomethingWithFoo(Nullsafe<Foo> foo);
}
由于我创建了一个隐式转换运算符 from Tto Nullsafe<T>,所以下面的代码可以正常工作:
Bar bar = new Bar();
Foo nullFoo = null;
bar.DoSomethingWithFoo(nullFoo);
Foo someFoo = new Foo();
bar.DoSomethingWithFoo(someFoo);
该Nullsafe<T>类型是一个结构(故意设计,以消除null直接传递任何值),因此有人可以编写以下代码段:
Nullable<Nullsafe<Foo>> nullableNullsafeFoo = null;
// and later
bar.DoSomethingWithFoo(nullableNullsafeFoo);
当然,该片段将不起作用。
所以,我认为从我的Nullsafe<T>结构中创建一个转换运算符是不费吹灰之力的,它将处理像上面这样的可为空的表达式:
public static implicit operator Nullsafe<T>(Nullable<Nullsafe<T>> nv) => nv.GetValueOrDefault();
不幸的是,这无法编译。编译器似乎Nullsafe<T>在Nullable<Nullsafe<T>>类型和类型之间没有区别,并向我抛出以下消息:
以上是编译器的限制,还是故意的行为?如果是这样,是否有任何已知的解决方法?
错误 CS0555:用户定义的运算符不能采用封闭类型的对象并转换为封闭类型的对象
我在用:
Visual Studio 社区 2017 v15.8.1
.NET Sdk v2.1.400(如图所示 dotnet --version
该项目是一个多面向不同 .NET 框架版本的库 - 从 net20 到 netstandard2.0
江户川乱折腾
千巷猫影
相关分类