相关疑难解决方法(0)

首选:Nullable <>.HasValue或Nullable <>!= null?

我总是使用(a)Nullable<>.HasValue因为我喜欢语义.然而,最近我正在研究其他人现有的代码库,他们Nullable<> != null专门使用(b)代替.是否有理由使用一个而不是另一个,还是纯粹的偏好?

(一个)

int? a;
if (a.HasValue)
    // ...
Run Code Online (Sandbox Code Playgroud)

(b)中

int? b;
if (b != null)
    // ...
Run Code Online (Sandbox Code Playgroud)

.net c# null nullable

408
推荐指数
4
解决办法
9万
查看次数

为什么Nullable <T>被认为是值类型?

您是否尝试过使用该Convert.ChangeType()方法将值转换为Nullable<T>类型?尴尬的是,它会抛出InvalidCastException一句话:"空对象无法转换为值类型".

尝试在您的即时窗口上运行此操作: ?System.Convert.ChangeType(null, typeof(int?))

出于某些不明原因,Nullables被认为是价值类型.例如,typeof(int?).IsValueType退货true.

对我来说,自从Nullable<T>接受以来null,它是类类型,而不是值类型.有谁知道为什么它会以不同的方式实施?

.net nullable

14
推荐指数
2
解决办法
2892
查看次数

在C#中,`x is int?`和`x is int`之间有区别吗?

class C<T> where T : struct {
    bool M1(object o) => o is T;
    bool M2(object o) => o is T?;
}
Run Code Online (Sandbox Code Playgroud)

传递null引用或盒装T值时,上述两种方法似乎表现相同.但是,生成的MSIL代码有点不同:

.method private hidebysig instance bool M1(object o) cil managed {
    .maxstack 8
    IL_0000: ldarg.1
    IL_0001: isinst !T
    IL_0006: ldnull
    IL_0007: cgt.un
    IL_0009: ret
}
Run Code Online (Sandbox Code Playgroud)

VS

.method private hidebysig instance bool M2(object o) cil managed {
    .maxstack 8
    IL_0000: ldarg.1
    IL_0001: isinst valuetype [mscorlib]System.Nullable`1<!T>
    IL_0006: ldnull
    IL_0007: cgt.un
    IL_0009: ret
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,o is …

c# boxing types cil nullable

11
推荐指数
1
解决办法
223
查看次数

为什么有Nullable <T>结构和Nullable类?

有一个Nullable<T>结构,还有另一个静态Nullable类,有三个静态方法.

我的问题是,为什么静态Nullable类中的这些静态方法不能进入Nullable<T>struct?在两种不同类型中定义它们的原因是什么?

还有一个INullable界面.它做什么?

c# nullable

4
推荐指数
1
解决办法
173
查看次数

为什么Nullable <T>,struct,允许'null'

Nullable是一个结构.我知道结构不能被指定为"空".那么我们如何才能将Nullable的对象赋给null呢?是什么原因?

c#

1
推荐指数
1
解决办法
208
查看次数

标签 统计

c# ×4

nullable ×4

.net ×2

boxing ×1

cil ×1

null ×1

types ×1