我想创建一个像Nullable这样的类,除非它可以用于类和结构:
public class MyWrapper<T>
{
public MyWrapper(T value)
{
Value = value;
}
public T Value { get; set; }
}
然后我想添加Nullable到MyWrapper的隐式转换:
public static implicit operator MyWrapper<T> (Nullable<T> value)
{
return new MyWrapper<T>(value);
}
当然,由于Nullable限制,它失败了:
只有不可为空的值类型可能是“System.Nullable&#39;
的基础
这是一个非常容易理解的错误,但理论上,我可以将任何Nullable转换为MyWrapper,因为Nullable 更难的限制比MyWrapper的限制更多。
那么Nullable对MyWrapper 隐式转换有什么解决方法吗?
为什么我需要将MyWrapper用于课程?
我们在后端使用某种不好的GraphQl并发送如下的更新对象:
class UpdateProductRequest
{
public MyWrapper<string> Country {get;set;}
public MyWrapper<string> Title {get;set;}
}
所以
new UpdateProductRequest
{
Title = "new title"
}
更新标题,但不更新国家/地区。
答案 0 :(得分:1)
您可以将基础类型的隐式转换定义为MyWrapper
:
public static implicit operator MyWrapper<T> (T value)
{
return new MyWrapper<T>(value);
}
现在有了这样的操作员,你可以这样做:
MyWrapper<int> w = new int?(5);
MyWrapper<int> w2 = (int?)null; //here casting method is not called
因此,最初将Nullable
转换为基础类型,然后转换为MyWrapper
。如果它为null,则只对类型MyWrapper
的变量赋值为null,这是类,因此它是有效的。 Nullable
由编译器进行特殊处理,因此它可能看起来像魔术但它可以工作。