标签: nullable

为什么这个代码在C#中无效?

以下代码将无法编译:

string foo = "bar";
Object o = foo == null ? DBNull.Value : foo;
Run Code Online (Sandbox Code Playgroud)

我得到:错误1无法确定条件表达式的类型,因为'System.DBNull'和'string'之间没有隐式转换

要解决这个问题,我必须做这样的事情:

string foo = "bar";
Object o = foo == null ? DBNull.Value : (Object)foo;
Run Code Online (Sandbox Code Playgroud)

这个演员似乎毫无意义,因为这肯定是合法的:

string foo = "bar";
Object o = foo == null ? "gork" : foo;
Run Code Online (Sandbox Code Playgroud)

在我看来,当三元分支具有不同类型时,编译器不会将值自动提供给类型对象...但是当它们属于相同类型时,则自动装箱是自动的.

在我看来,第一个声明应该是合法的......

任何人都可以描述为什么编译器不允许这样做以及为什么C#的设计者选择这样做?我相信这在Java中是合法的......虽然我没有验证这一点.

谢谢.

编辑:我要求理解为什么Java和C#以不同的方式处理这个问题,C#中的场景下发生了什么使得它无效.我知道如何使用三元,而不是寻找一个"更好的方法"来编写示例代码.我理解C#中的三元规则,但我想知道为什么......

编辑(Jon Skeet):删除了"autoboxing"标签,因为这个问题没有涉及拳击.

c# dbnull nullable conditional-operator

40
推荐指数
3
解决办法
1万
查看次数

将Linq中的可空类型与Sql进行比较

我有一个Category实体,它有一个Nullable ParentId字段.当下面的方法正在执行且categoryId为null时,结果似乎为null,但是有些类具有null ParentId值.

这里有什么问题,我错过了什么?

public IEnumerable<ICategory> GetSubCategories(long? categoryId)
{
    var subCategories = this.Repository.Categories.Where(c => c.ParentId == categoryId)
        .ToList().Cast<ICategory>();

    return subCategories;
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,当我将条件更改为(c.ParentId == null)时,结果似乎正常.

c# nullable linq-to-sql

40
推荐指数
4
解决办法
5万
查看次数

使用postgresql DB存储NULL值需要多少磁盘空间?

假设我的表上有一列定义了以下内容:

"MyColumn" smallint NULL
Run Code Online (Sandbox Code Playgroud)

存储类似0,1或其他值的值应该需要2个字节(1).但是如果我将"MyColumn"设置为NULL,需要多少空间?它需要0个字节吗?

是否有一些额外需要的字节用于管理目的或每个列/行的此类事项?

(1)http://www.postgresql.org/docs/9.0/interactive/datatype-numeric.html

sql postgresql types nullable

40
推荐指数
2
解决办法
9860
查看次数

为什么将短空值转换为int null值以便与null进行比较?

当我比较可空的短值时,编译器首先将它们转换为整数以与null进行比较.例如,考虑这个简单的代码:

short? cTestA;
if (cTestA == null) { ... }
Run Code Online (Sandbox Code Playgroud)

它由编译器转换为:

short? CS$0$0001 = cTestA;
int? CS$0$0002 = CS$0$0001.HasValue ? new int?(CS$0$0001.GetValueOrDefault()) : null;
if (!CS$0$0002.HasValue){ ... }
Run Code Online (Sandbox Code Playgroud)

这适用于包括.NET 4在内的所有.NET版本.

我在这里错过了什么?仅针对HasValue检查进行双重转换的原因是什么?

跟进

我期望编译器做的是使用.HasValue进行简单的检查if (cTestA.HasValue){}.至少这是我在发现此转换后在代码中执行的操作.

为什么所有这些额外的代码都添加了这么简单的测试?

c# compiler-construction nullable

40
推荐指数
2
解决办法
4881
查看次数

Django:按位置排序忽略NULL

我有django queryset排序的问题.

我的模型包含一个名为position(PositiveSmallIntegerField)的字段,我想用它来订购查询结果.

我使用order_by('position'),效果很好.

问题:我的position字段是可空的(null=True, blank=True),因为我不想为我的模型的每50000个实例指定一个位置:(

当某些实例具有NULL"位置"时,order_by将它们返回到列表顶部:我希望它们在最后...

在RAW SQL中,我曾经写过像" IF(position IS NULL or position='', 1, 0)" 这样的东西(参见http://www.shawnolson.net/a/730/mysql-sort-order-with-null.html):是否有可能使用相同的结果Django,没有编写原始SQL?

非常感谢 !

django nullable sql-order-by

39
推荐指数
4
解决办法
8633
查看次数

将String转换为Nullable DateTime

可能重复:
如何将DateTime.TryParse与Nullable <DateTime>一起使用?

我有这行代码

DateTime? dt = Condition == true ? (DateTime?)Convert.ToDateTime(stringDate) : null;
Run Code Online (Sandbox Code Playgroud)

这是一个字符串转换为可空的DateTime正确的方法,或者是有没有到转换的直接方法,转换它为DateTime,再次铸造它可空的DateTime?

c# datetime nullable

39
推荐指数
2
解决办法
5万
查看次数

为什么`null` Nullable <T>有哈希码?

有点奇怪的问题......

但是,任何人都可以给我一个理由,说明为什么这会是预期的行为?

这对我来说似乎很奇怪....

//Makes perfect sense
object o = null;
o.GetHashCode().Dump();
Run Code Online (Sandbox Code Playgroud)

NullReferenceException:未将对象引用设置为对象的实例.

//Seems very odd
int? i = null;
i.GetHashCode().Dump();
Run Code Online (Sandbox Code Playgroud)

0

这显然意味着:

int? zero = 0;
int? argh = null;

zero.GetHashCode() == argh.GetHashCode(); //true
Run Code Online (Sandbox Code Playgroud)

c# nullable

38
推荐指数
3
解决办法
3225
查看次数

C#DBNull和可空类型 - 最清晰的转换形式

我有一个DataTable,它有许多列.其中一些列可以为空.

DataTable dt;  // Value set. 
DataRow dr;  // Value set. 

// dr["A"] is populated from T-SQL column defined as: int NULL 
Run Code Online (Sandbox Code Playgroud)

那么,什么是从DataRow中的值转换为可空变量的最干净形式.

理想情况下,我可以做类似的事情:

int? a = dr["A"] as int?; 
Run Code Online (Sandbox Code Playgroud)

编辑:原来你可以这样做,副作用是如果你的Schema类型没有整数,那么这总是会返回null.Ruben使用的答案dr.Field<int?>("A")确保类型不匹配不会无声地失败.当然,这将通过彻底的单元测试来获得.

相反,我通常会输入以下内容:

int? a = dr["A"] != DBNull.Value ? (int)dr["A"] : 0; 
Run Code Online (Sandbox Code Playgroud)

这是一堆更多的击键,但更重要的是,有更多的空间让某人用错误的击键来填充内容.是的,单元测试会选择它,但我宁愿完全停止它.

对于这种情况,什么是最干净,最不容易出错的模式.

c# datatable types nullable

37
推荐指数
2
解决办法
4万
查看次数

TypeScript 中的可选参数可以为 null 吗?

根据这篇文章,当在 TypeScript 中启用严格的空值检查时,除非联合明确允许,否则您不能分配null或分配undefined给变量。

// required value
let req: string;
req = "Something";  // OK
req = null;      // Error
req = undefined; // Error

// nullable value
let nbl: string | null;
nbl = "Something";  // OK
nbl = null;      // OK
nbl = undefined; // Error
Run Code Online (Sandbox Code Playgroud)

但是在 TypeScript 中null允许在可选值中使用吗?

// optional value
let opt?: string; // (actually invalid, as optional types cannot be used for variable declarations, but that's …
Run Code Online (Sandbox Code Playgroud)

nullable undefined optional typescript

37
推荐指数
1
解决办法
2万
查看次数

为什么可空的bool不允许if(可为空)但允许if(nullable == true)?

此代码编译:

private static void Main(string[] args)
{
    bool? fred = true;

    if (fred == true)
        Console.WriteLine("fred is true");
    else if (fred == false)
         Console.WriteLine("fred is false");
    else Console.WriteLine("fred is null");
}
Run Code Online (Sandbox Code Playgroud)

此代码无法编译.

private static void Main(string[] args)
{
    bool? fred = true;

    if (fred)
        Console.WriteLine("fred is true");
    else if (!fred)
         Console.WriteLine("fred is false");
    else Console.WriteLine("fred is null");
}
Run Code Online (Sandbox Code Playgroud)

我想如果(booleanExpression == true)应该是冗余.在这种情况下为什么不呢?

.net c# nullable

36
推荐指数
2
解决办法
6001
查看次数