簡體   English   中英

在C#中為可為空的結構的成員分配值

[英]Assigning value to member of nullable struct in C#

在C#中,我有一個像這樣的結構:

public struct Slab
{   public float[] sizeM;
    public string textureSrc;
    //more members, not relevant here...
}

另一個像這樣:

public struct Tombstone
{   public Slab mainSlab;
    public Slab? basing;
    //more...
}

現在,我要修改基於以下內容的成員:

uiState[0].stone.basing.Value.sizeM[2] = Int32.Parse(breadthField.Value) / 100.0f;
uiState[0].stone.basing.Value.textureSrc = fileName;

uiState[0].stoneTombstone類型的)

首先這兩個電話的正常工作,因為我只是改變了陣列的成員basing ,而不是數組本身。 但是,第二個抱怨:

Cannot modify the return value of 'Slab?.Value' because it is not a variable

如果我對mainSlab進行同樣的mainSlab這不能為空),則可以使用。 有沒有一種方法可以在不將整個basing復制到局部變量進行更改的情況下進行此操作?

有沒有一種方法可以在不將整個基礎復制到局部變量進行更改的情況下進行此操作?

不可以,因為Nullable<T>不提供對基礎值字段的直接訪問。 您不能“就地”修改它。

當您使用可變結構時,會有各種各樣的小問題。 我強烈建議您盡可能使用類或不可變結構,以避免出現這些極端情況。

坦白說,這里的主要錯誤幾乎可以肯定:具有可變的結構。 現在,在某些情況下可變結構是有意義的,但是這些情況很狹窄 ,幾乎可以肯定不是其中之一。

坦白說,如果您停止這樣做,則代碼將更容易合理化; 使用最新的C#,您甚至可以使用readonly struct來幫助實施此操作(並使用in獲得更好的行為):

public readonly struct Slab
{   public readonly float[] sizeM;
    public readonly string textureSrc;
    //more members, not relevant here...
}

(我個人也會考慮使用屬性而不是公共字段,但這是一個單獨的問題)

然后很明顯,您只能分配整個對象:

Slab? foo = ...
... some logic
foo = new Slab(size, textureSource); // perhaps taking new values from the old

唯一的其他選擇是基本上做同樣的事情

Slab? foo = ...
// ...
var innerVal = foo.GetValueOrDefault(); // or .Value if you've already null-checked
// ...
innerVal.textureSrc = ...
foo = innerVal;

此“問題”可能有許多可能的修復,具體取決於設計的其余部分和要求...例如:

public struct Tombstone
{
  public Slab mainSlab;
  public Slab basing;
  public bool hasBasing => basing.sizeM != null;
  //more...
}

老實說,我從未使用過Nullables ... Nullable值類型,接下來是什么,全局rvalues?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM