2014-02-05 42 views
0

我有这个类:自定义类型。分配。如何复制实例并仅分配值部分?

public struct Field<T> 
{ 
    public Field(int ordinal, int number) 
     : this(ordinal, number, default(T)) 
    { 

    } 

    public Field(int ordinal, int number, T value) 
     : this() 
    { 
     Ordinal = ordinal; 
     Number = number; 
     Value = value; 
    } 

    public int Ordinal 
    { 
     get; 
     private set; 
    } 

    public int Number 
    { 
     get; 
     private set; 
    } 

    public T Value 
    { 
     get; 
     private set; 
    } 

    public static implicit operator Field<T>(T value) 
    { 
     Field<T> sarsField = new Field<T>(); 
     sarsField.Value = value; 
     return sarsField; 
    } 

    public static implicit operator T(Field<T> value) 
    { 
     return value.Value; 
    } 

    public override string ToString() 
    { 
     return Value.ToString(); 
    } 
} 

我用它如下:

// Declare field 
    Field<DateTime> dateOfBirth = new Field<DateTime>(5, 25); 

    // Set value 
    dateOfBirth = DateTime.Today; 

问题是当我分配一个DateTimedateOfBirth它构建了一个new Field,但失去了原有的值OrdinalNumber 。如何在做隐式赋值时只更改Value属性?这可能吗?

如果我做的setter公众Value,我可以这样做:

// Set value 
    dateOfBirth.Value = DateTime.Today; 

仅实现了Value设置,保留OrdinalNumber的期望的结果。但是,我真的很想隐式地这样做。有一些地方我想用Field<Type>替换Type。因此,我正在寻找一个隐含的解决方案。

回答

1

你不能。分配会覆盖原始变量;它不允许你仅仅覆盖变量的一个属性,而只保留其余部分。另外,struct应该是不可变的,所以不应允许以任何方式修改Value属性。如果你真的想允许这样做,我建议使用class而不是struct,并公布制作者Value

但是,如果你想保持它作为一个struct,我建议这样的事情,而不是:

public Field<T> WithValue(T value) 
{ 
    return new Field<T>(this.Ordinal, this.Number, value); 
} 

然后调用它像这样:

dateOfBirth = dateOfBirth.WithValue(DateTime.Today); 

另外请注意,我强烈建议使operator T明确,因为它会丢弃OrdinalNumeric值。从MSDN请参见本附注:

如果转换操作会导致异常或丢失信息,你应该将其标记explicit

+0

+1,这就是[自定义赋值运算符](http://msdn.microsoft.com/en-us/library/09479473.aspx)必须是'static'的原因。 – Noseratio