相关疑难解决方法(0)

C#可以将值类型与null进行比较

我今天碰到了这个,并且不知道为什么C#编译器没有抛出错误.

Int32 x = 1;
if (x == null)
{
    Console.WriteLine("What the?");
}
Run Code Online (Sandbox Code Playgroud)

我很困惑x怎么可能是null.特别是因为这个赋值肯定会抛出编译器错误:

Int32 x = null;
Run Code Online (Sandbox Code Playgroud)

是否有可能x变为null,微软是否决定不将此检查放入编译器,还是完全错过了?

更新:在编写了这篇文章的代码后,编译器突然发出一个警告,表达式永远不会成立.现在我真的迷路了.我把对象放到一个类中,现在警告已经消失,但是留下了问题,值类型最终是否为null.

public class Test
{
    public DateTime ADate = DateTime.Now;

    public Test ()
    {
        Test test = new Test();
        if (test.ADate == null)
        {
            Console.WriteLine("What the?");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

c# null

85
推荐指数
3
解决办法
2万
查看次数

为什么我允许将非可空类型与null进行比较?

可能重复:
C#可以将值类型与null进行比较

如果我尝试null在C#中分配一个不可为空的类型:

System.DateTime time = null;
Run Code Online (Sandbox Code Playgroud)

我会得到一个编译时错误:

错误CS0037:无法将null转换为'System.DateTime',因为它是一个不可为空的值类型

这是有道理的.但如果比较相同的类型null:

System.DateTime time = obtainFromSomewhere();
if( time == null ) {
    //whatever;
}
Run Code Online (Sandbox Code Playgroud)

没有编译时错误.这对我来说没有意义 - 如果我不能分配null那么为什么会这样null呢?

为什么我可以将非可空类型与null?进行比较?

.net c# nullable non-nullable

17
推荐指数
2
解决办法
3544
查看次数

C#visual studio编译器如何处理struct/NULL比较?

我们刚刚在c#.net 4代码库中遇到了一些这样的错误代码

DateTime myDate = someValue;
If (myDate==Null)
    Do Something
Run Code Online (Sandbox Code Playgroud)

我们发现这种情况永远不会发生.

编译器如何处理这些不可为空的结构比较?

最初我们感到惊讶的是它会编译......但是在你可以肯定有一个恒定的比较的点上合理化它:

If(1==2)
Run Code Online (Sandbox Code Playgroud)

哪个也永远不会解决...但在这种情况下,编译器可以轻松地告诉它们是常量.它是否优化或汇总不可空的比较?

c# compiler-construction null struct compile-time-constant

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

为什么在C#中将结构与NULL合法进行比较?

可能重复:
C#可以将值类型与null进行比较

使用TimeSpan考虑以下代码,TimeSpan是一个结构:

// will not compile - illegal
TimeSpan ts = null;  
Run Code Online (Sandbox Code Playgroud)

但是,以下代码确实编译并且是合法的,尽管表达式始终为false:

if (ts == null)
    Console.WriteLine("this line will never be hit");
Run Code Online (Sandbox Code Playgroud)

有人能告诉我为什么将结构设置为NULL是无效的,但可以将它与一个进行比较吗?

c# null struct

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