以下代码将无法编译:
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"标签,因为这个问题没有涉及拳击.
我有一个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)时,结果似乎正常.
假设我的表上有一列定义了以下内容:
"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
当我比较可空的短值时,编译器首先将它们转换为整数以与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){}.至少这是我在发现此转换后在代码中执行的操作.
为什么所有这些额外的代码都添加了这么简单的测试?
我有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?
非常感谢 !
我有这行代码
DateTime? dt = Condition == true ? (DateTime?)Convert.ToDateTime(stringDate) : null;
Run Code Online (Sandbox Code Playgroud)
这是一个字符串转换为可空的DateTime正确的方法,或者是有没有到转换的直接方法,转换它为DateTime,再次铸造它可空的DateTime?
有点奇怪的问题......
但是,任何人都可以给我一个理由,说明为什么这会是预期的行为?
这对我来说似乎很奇怪....
//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) 我有一个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)
这是一堆更多的击键,但更重要的是,有更多的空间让某人用错误的击键来填充内容.是的,单元测试会选择它,但我宁愿完全停止它.
对于这种情况,什么是最干净,最不容易出错的模式.
根据这篇文章,当在 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) 此代码编译:
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)应该是冗余.在这种情况下为什么不呢?
nullable ×10
c# ×7
types ×2
.net ×1
datatable ×1
datetime ×1
dbnull ×1
django ×1
linq-to-sql ×1
optional ×1
postgresql ×1
sql ×1
sql-order-by ×1
typescript ×1
undefined ×1