2014-02-05 41 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