![](/img/trans.png)
[英]c# How do I create a long (>128 bytes for example) field in a structure without using arrays. I can't have any reference type fields in the structure
[英]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.