直接访问struct内部值

时间:2017-03-08 10:45:14

标签: c# struct nullable

不确定如何说这个或搜索它,因为我没有“真实姓名”。

C#中的某些结构可以直接用作其包含类型,取Nullable<>例如,Nullable可以直接被视为int,例如:

Nullable<int> ex;

void Example(){
    ex += 1;
}

我现在的问题是在我自己的结构中实现这种行为,例如我可以创建一个Savable并且仍然可以将变量视为像nulllable中的普通int一样?例如,而不是做mySavable.value。

希望我的问题足够清楚,毫无疑问是一个重复的问题,但我在搜索中找不到另一个,因为我缺乏这种“技术”的正确名称。对此提前抱歉!

非常感谢!

2 个答案:

答案 0 :(得分:4)

Nullable<>类型是个坏例子。它是编译器支持的,并且它具有其他任何人都无法做到的魔力。

您可以定义一些隐式/显式转换运算符,它们将隐式或显式转换YourStruct <-> int,或者您可以定义一些接受例如YourStruct + int的运算符。两种解决方案都将解决您的问题请注意,要获取+=运算符,您只需定义返回+的{​​{1}}运算符(或定义隐式转换YourStruct)。

例如,重载int -> YourStruct并将隐式强制转换转换为/ operator+(Example1, Example1),您可以:

int

然后

public struct Example1
{
    public readonly int Value;

    public Example1(int value)
    {
        this.Value = value;
    }

    public static Example1 operator +(Example1 t1, Example1 t2)
    {
        return new Example1(t1.Value + t2.Value);
    }

    // This is used only for the "int v1 = e1;" row
    public static implicit operator int(Example1 value)
    {
        return value.Value;
    }

    public static implicit operator Example1(int value)
    {
        return new Example1(value);
    }
}

或者您可以简单地重载Example1 e1 = 1; Example1 e2 = 2; Example1 sum1 = e1 + e2; Example1 sum2 = e1 + 4; Example1 sum3 = 4 + e1; sum3 += sum1; sum3 += 1; int v1 = e1; operator+之间的各种Example2

int

然后

public struct Example2
{
    public readonly int Value;

    public Example2(int value)
    {
        this.Value = value;
    }

    public static Example2 operator +(Example2 t1, Example2 t2)
    {
        return new Example2(t1.Value + t2.Value);
    }

    public static Example2 operator +(Example2 t1, int t2)
    {
        return new Example2(t1.Value + t2);
    }

    public static Example2 operator +(int t1, Example2 t2)
    {
        return new Example2(t1 + t2.Value);
    }
}

(请注意,Example2 e1 = new Example2(1); Example2 e2 = new Example2(2); Example2 sum1 = e1 + e2; Example2 sum2 = e1 + 4; Example2 sum3 = 4 + e1; sum3 += sum1; sum3 += 1; int v1 = e1.Value; 不是可交换的,因此我必须定义operator+Example2 + int

答案 1 :(得分:0)

看看here。你会注意到Nullable&lt; T&gt;重载隐式转换运算符。这就是为什么T可以隐式转换为Nullable&lt; T&gt;。如果您需要其他操作员,则必须在课堂上重载它们。