c# - totalhours - timespan totalseconds




なぜTimeSpanとGuid Structsをnullと比較できますか? (4)

私はいくつかの.NETの構造体がnullと比較できることに気づいた。 例えば:

  TimeSpan y = new TimeSpan();
        if (y == null)
            return;

ちょうど良い(Guid構造体と同じ)コンパイルされます。
今はstuctsが値型で、上記のコードはコンパイルしてはいけないことを知っています。 しかし、限り、私はそこにないと言うことができます。
私はリフレクターを使ってクラスを見てきましたが、MSDNのドキュメントも見ました。
2人は次のインターフェイスを実装しています:

IComparable, IComparable<T>, IEquatable<T>

しかし、同じインターフェースを実装しようとすると、役に立たないように見えました。

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;
    }
}

私は使用しています:.NET 2.0 Visual Studio 2005。

誰が何の理由があるのか​​分かりませんか? 私はちょうどより良い理解を得ることを試みている。 これは問題ではありません。なぜなら、とにかく構造体をnullと比較しないでください。


==演算子です。

TimeSpanクラスには、等価演算子のオーバーロードがあります。

public static bool operator ==(DateTime d1, DateTime d2)
{
     return (t1._ticks == t2._ticks);
}

これはそれ自体ではnullと比較することはできませんが、 ...

null可能な型が到着すると、 各構造体は暗黙的にヌル可能な型に変換されるので、

TimeSpan y = new TimeSpan();
if (y == null)
    return;

あなたこれが起こっているのを見ない

TimeSpan y = new TimeSpan();
if ((Nullable<TimeSpan>)y == (Nullable<TimeSpan>)null)
    return;

Nullは暗黙的な変換(暗黙の代入?)を取得しますが、 すべてのSystem.Objectオブジェクトではできません。

TimeSpan y = new TimeSpan();
object o = null;
if (y == o) //compiler error
    return;

さて、しかし、等価演算子はnullable引数を取っていませんか?

さて、 msdnはここで助けになる、と述べています:

あらかじめ定義された単項演算子と二項演算子、および値型用に存在するユーザー定義演算子は、NULL値型でも使用できます。 これらの演算子は、オペランドのいずれかがnullの場合にはNULL値を生成します。 それ以外の場合、演算子は含まれた値を使用して結果を計算します。

したがって、各オペレータのために 、固定定義された振る舞いで、 空きのためのヌル可能な実装を効果的に取得ます。 上記の "包含された値"は、null値が設定できない演算子が返す実際の値です。


私はそれを発見 :)

次の警告が表示されます。

int i = 0;
if (i == null)
// ^^ Warning: The result of the expression is always 'false' since a value of
//             type 'int' is never equal to 'null' of type 'int?'

コンパイラは、あなたが入力したnullが型TimeSpan?に変換されたという正しい警告を出していませTimeSpan? 比較のために。

編集:仕様の関連するセクションは、 nullを暗黙のうちにnull可能な型に変換することができるという§13.7.1であり、値型Tが暗黙的にT?変換されることを示す§13.7.2の(読みにくい) 。

私が元々書いたもの:

何が起こっているのかは、JaredParのように単純にfalseてコンパイルするので、C#の仕様にあるものです。

これはコンパイルされないことに注意してください。

TimeSpan ts = new TimeSpan();
object o = null;
if (ts == o) // error, Operator '==' cannot be applied to operands of type 'System.TimeSpan' and 'object'
    ...

この問題は、null値の型が含まれている場合に効果的に導入されました。 TimeSpanからTimeSpanへの暗黙の変換がありTimeSpan? TimeSpan?との比較がありTimeSpan? その型のヌル値

コンパイラは、何をしようとしているのかを明確にするために、いくつかの型について警告を出します。

int x = 10;
if (x == null)
{
    Console.WriteLine();
}

この警告を表示します。

Test.cs(9,13): warning CS0472: The result of the expression is always 'false'
       since a value of type 'int' is never equal to 'null' of type 'int?'

私はMarc Gravellと信じて、一度警告が与えられた状況を解決しました。一貫していないのは残念です。








struct