相关疑难解决方法(0)

什么是解除运营商?

我正在看这篇文章,并且正在努力遵循解释提升运算符的VB.NET示例.似乎没有相应的C#示例或教程.我一般都没有太多关于运算符重载的经验,因此在阅读可空类型的同时尝试使用VB.NET等价物可能不是最好的开始...

是否有人能够解释提升的运算符以及它们如何被可空类型使用?它只是意味着可空类型本身不会重载运算符,并将使用它所代表的基础类型的运算符吗?

关于提升的运营商似乎没有太多关于SO的信息,所以希望这也可以帮助其他人.

.net c# nullable lifted-operators

56
推荐指数
1
解决办法
9364
查看次数

Nullable <T>的装箱/拆箱行为怎么可能?

我今天早些时候发生的事情让我摸不着头脑.

Nullable<T>可以为任何类型的变量赋值null.例如:

int? i = null;
Run Code Online (Sandbox Code Playgroud)

起初,我看不出如何做到这一点是可能的,而不以某种方式从定义的隐式转换objectNullable<T>:

public static implicit operator Nullable<T>(object box);
Run Code Online (Sandbox Code Playgroud)

但是上面的运算符显然不存在,就好像它确实如此,那么下面的内容也必须是合法的,至少在编译时(它不是):

int? i = new object();
Run Code Online (Sandbox Code Playgroud)

然后我意识到,也许Nullable<T>类型可以定义一个隐式转换为一些永远无法实例化的任意引用类型,如下所示:

public abstract class DummyBox
{
    private DummyBox()
    { }
}

public struct Nullable<T> where T : struct
{
    public static implicit operator Nullable<T>(DummyBox box)
    {
        if (box == null)
        {
            return new Nullable<T>();
        }

        // This should never be possible, as a DummyBox cannot be instantiated.
        throw new InvalidCastException();
    }
} …
Run Code Online (Sandbox Code Playgroud)

.net c# vb.net boxing nullable

32
推荐指数
1
解决办法
5078
查看次数

我可以在 C# 中重载“从空值转换”运算符吗?

我在 C# 中有一个结构类型。我希望能够null隐式转换为这种类型。例如,null可以由结构类型的特殊值表示,并且强制转换运算符应返回具有此值的结构。

在 C++ 中,我可以使用 type 的隐式强制转换运算符重载std::nullptr_t。C# 中有类似的类型吗?

我有使用一个NullType没有实例的特殊类的想法。这有效,但看起来有点难看。有没有更好的办法?

例子:

class NullType
{
    private NullType(){} // ensures that no instance will ever be created
}

struct X
{
    private static readonly int nullValue = -1;
    private int val;

    public X(int val){ this.val= val; }

    public static implicit operator X(NullType t)
    { 
        return new X(nullValue);
    }
}

class MainClass
{
     public static void Main(string[] args)
     {
          X x = null; // Works …
Run Code Online (Sandbox Code Playgroud)

c# null struct

5
推荐指数
1
解决办法
414
查看次数

标签 统计

c# ×3

.net ×2

nullable ×2

boxing ×1

lifted-operators ×1

null ×1

struct ×1

vb.net ×1