我今天碰到了这个,并且不知道为什么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) 我在一个KeyValuePair方法上有一个'可选'参数.我想要一个将null传递给此参数的核心方法的重载,但是在核心方法中,当我想检查KeyValuePair是否为null时,我收到以下错误:
Operator '!=' cannot be applied to operands of type System.Collections.Generic.KeyValuePair<string,object>' and '<null>.
Run Code Online (Sandbox Code Playgroud)
如何禁止检查对象是否为空?
可能重复:
C#可以将值类型与null进行比较
我在多线程环境中处理Windows应用程序,有时会得到异常"在创建窗口句柄之前,无法在控件上调用Invoke或BeginInvoke." 所以我想我只是添加这行代码:
if(this.Handle != null)
{
//BeginInvokeCode
}
Run Code Online (Sandbox Code Playgroud)
但这并没有解决问题.所以我进一步挖掘,并意识到IntPtr(Form.Handle所属的类型)是一个不能为空的结构.这是有效的修复:
if(this.Handle != IntPtr.Zero)
{
//BeginInvokeCode
}
Run Code Online (Sandbox Code Playgroud)
那么它打击了我,为什么它甚至在我检查它为null时编译?所以我决定自己尝试一下:
public struct Foo { }
Run Code Online (Sandbox Code Playgroud)
然后:
static void Main(string[] args)
{
Foo f = new Foo();
if (f == null) { }
}
Run Code Online (Sandbox Code Playgroud)
并且肯定它没有编译说"错误1运算符'=='不能应用于'ConsoleApplication1.Foo'和'''类型的操作数.好的,那么我开始查看IntPtr的元数据,并开始将所有内容添加到IntPtr结构中的Foo结构(ISerializable,ComVisible),但没有任何帮助.最后,当我添加运算符重载==和!=时,它工作:
[Serializable]
[ComVisible(true)]
public struct Foo : ISerializable
{
#region ISerializable Members
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
throw new NotImplementedException();
}
#endregion
public override bool Equals(object obj)
{
return base.Equals(obj);
}
public override int GetHashCode()
{
return …
Run Code Online (Sandbox Code Playgroud) 我注意到一些.NET结构可以与null进行比较.例如:
TimeSpan y = new TimeSpan();
if (y == null)
return;
Run Code Online (Sandbox Code Playgroud)
将编译得很好(与Guid结构相同).
现在我知道stucts是值类型,并且上面的代码不应该编译,除非有一个带有对象的operator ==的重载.但是,据我所知,没有.
我用Reflector和MSDN上的文档查看了这个类.
他们两个确实实现了以下接口:
IComparable, IComparable<T>, IEquatable<T>
Run Code Online (Sandbox Code Playgroud)
但是,尝试使用相同的接口似乎没有帮助:
struct XX : IComparable, IComparable<XX>, IEquatable<XX> {
public int CompareTo(Object obj) {
return 0;
}
public int CompareTo (XX other){
return 0;
}
public bool Equals (XX other){
return false;
}
public override bool Equals(object value){
return false;
}
public static int Compare(XX t1, XX t2){
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用:.NET 2.0 Visual Studio 2005.
有谁知道这是什么原因?我只是想更好地理解.这不是问题,因为我知道我不应该将结构与null进行比较.