Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从Nullable的隐式转换_C#_Nullable - Fatal编程技术网

C# 从Nullable的隐式转换

C# 从Nullable的隐式转换,c#,nullable,C#,Nullable,我想创建一个类似Nullable的类,除了它可以处理类和结构之外: public class MyWrapper<T> { public MyWrapper(T value) { Value = value; } public T Value { get; set; } } 更新标题,但不更新国家/地区。您可以定义从基础类型到MyWrapper的隐式转换: public static implicit operator MyWrap

我想创建一个类似Nullable的类,除了它可以处理类和结构之外:

public class MyWrapper<T>
{
    public MyWrapper(T value)
    {
        Value = value;
    }

    public T Value { get; set; }
}

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

您可以定义从基础类型到
MyWrapper的隐式转换:

public static implicit operator MyWrapper<T> (T value)
{
    return new MyWrapper<T>(value);
}
公共静态隐式运算符MyWrapper(T值)
{
返回新的MyWrapper(值);
}
现在,使用该运算符,您可以执行以下操作:

MyWrapper<int> w = new int?(5);
MyWrapper<int> w2 = (int?)null; //here casting method is not called
MyWrapper w=newint?(5);
MyWrapper w2=(int?)null//这里不调用铸造方法

因此,最初,
Nullable
被转换为底层类型,然后转换为
MyWrapper
。如果为空,则只为类型为
MyWrapper
的变量赋值为空,该变量是类,因此它是有效的
Nullable
经过编译器的特殊处理,因此它看起来像一个魔术,但它可以工作。

类不是天生就可以为Null吗?“我不确定我是否明白你想做什么。”“勒内·沃格特,是的,你说得对。我已经修好了密码。谢谢@TJWolschon,是的。我们使用MyWrapper有一些特殊的用途来区分null MyWrapper和带有null的MyWrapper。我们理解应该将值修改为null(如果MyWrapper有null值)还是应该跳过对应的值(如果MyWrapper本身为null),我认为没有好的方法来解决这个问题。编译器需要对
Nullable
实施限制。因此,唯一的另一种方法是创建泛型运算符(为null值使用第二个类型参数),但@RenéVogt。是的,我知道不支持泛型运算符(首先,我警告过这种情况:MyWrapper myVal=(int?)null;null->T将引发异常,所有内容都会下降。但是你知道吗?它起作用,在这种情况下,你将使用null MyWrapper。你能解释这种行为吗?这对我的目标很好,对我来说有点出乎意料。@RustamSalahutdinov没有对
MyWrapper
进行强制转换-操作符的方法没有被调用。它是e与写入
MyWrapper myVal=null;
new UpdateProductRequest
{
    Title = "new title"
}
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