簡體   English   中英

如何在C#中將引用類型分配給結構

[英]How a reference type can be assigned to a structure in c#

Int I=7;
Int ? j= null;

在這里,我們可以將引用類型(空)分配給值類型(j)。 由於此可為空的東西位於System.Nullable命名空間下,該名稱空間是一種結構。 這怎么可能。?

int ? j= null int ? j= null是語法糖。

這個:

private void Foo()
{
    int? i = null;
}

這個:

private void Foo()
{
    Nullable<int> i = null;
}

和這個:

private void Foo()
{
    Nullable<int> i = new Nullable<int>();
}

編譯成:

.method private hidebysig instance void  Foo() cil managed
{
  // Code size       10 (0xa)
  .maxstack  1
  .locals init ([0] valuetype [mscorlib]System.Nullable`1<int32> i)
  IL_0000:  nop
  IL_0001:  ldloca.s   i
  IL_0003:  initobj    valuetype [mscorlib]System.Nullable`1<int32>
  IL_0009:  ret
} // end of method Program::Foo

哪里

IL_0001:  ldloca.s   i
IL_0003:  initobj    valuetype [mscorlib]System.Nullable`1<int32>

表示初始化結構實例。

因此,不存在空引用,並且存在對象。 無需NullReferenceException即可訪問其只讀屬性HasValue

int? i = null;
Console.WriteLine(i.HasValue);

False

Console.WriteLine(i.Value);

不會拋出NullReferenceException,而是拋出InvalidOperationException

雖然

Console.WriteLine(i.GetType());

拋出NullReferenceException。

長話短說,對於Nullable<T>還是T? null表示不是 null-reference ,而是HasValue設置為false的Nullable<T>實例

如果你正在尋找一種方式

如何在C#中將引用類型分配給結構

嘗試這個:

class Program
{
    private static void Main(string[] args)
    {
        Struct<int> @struct = new Class<int>(-1);
        Class<int> @class = new Struct<int>(-1);
    }
}

class Class<T>
{
    public T Value { get; }

    public Class(T value) => Value = value;

    public static implicit operator Struct<T>(Class<T> instance) => new Struct<T>(instance.Value);
}

struct Struct<T>
{
    public T Value { get; }

    public Struct(T value) => Value = value;

    public static implicit operator Class<T>(Struct<T> instance) => new Class<T>(instance.Value);
}

請記住,它只是看做分配,但是在真正的分配發生之前就進行了轉換。

C#規范在這一點上很明確: null關鍵字表示沒有類型的表達式。 它既不是引用類型,也不是值類型,也不是指針類型。 但是,該表達式可轉換為所有這些類型。 不需要編譯器將所有表達式分類為具有類型,事實上,事實並非如此。

任何類型都可以包含null

1)對於引用類型:如果引用類型變量包含null ,則表示它未指向堆上的任何內容。 引用類型變量存儲在堆棧中,並且可以包含null或對實際堆對象的引用。

2)對於值類型:如果可為空的值類型變量包含null ,則表示其自身不包含任何值。 值類型存儲在堆棧上(在大多數情況下),並且可以在其內部包含直接值,也可以包含null

暫無
暫無

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

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