相关疑难解决方法(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进行比较?

我在一个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)

如何禁止检查对象是否为空?

.net c# generics

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

将结构比较为null

可能重复:
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)

c# null struct

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

为什么TimeSpan和Guid Structs可以比较为null?

我注意到一些.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进行比较.

.net c# null struct .net-2.0

18
推荐指数
3
解决办法
7489
查看次数

标签 统计

c# ×4

null ×3

.net ×2

struct ×2

.net-2.0 ×1

generics ×1