Nullable的隐式转换

时间:2018-04-03 12:24:51

标签: c# nullable

我想创建一个像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"
}

更新标题,但不更新国家/地区。

1 个答案:

答案 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由编译器进行特殊处理,因此它可能看起来像魔术但它可以工作。