問題タブ [lifted-operators]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - System.Nullablenull * int値の値は何ですか?
次のステートメントを検討してください。
の値は v2
? (null
または空の文字列?)
コンパイラが無効な操作としてマークするのを防ぐにはどうすればよいですか? カスタム例外処理に従う必要がありますか?
c# - 持ち上げられた演算子とは何ですか?
私はこの記事を見ていましたが、持ち上げられた演算子を説明する VB.NET の例に従うのに苦労しています。同等の C# の例やチュートリアルはないようです。私は一般的に演算子のオーバーロードの経験があまりないので、null 許容型を読みながら VB.NET の同等物に慣れようとすることは、おそらく開始するのに最適な場所ではありません...
持ち上げられた演算子の説明と、それらが null 許容型でどのように使用されるかを説明できる人はいますか? null許容型自体は演算子をオーバーロードせず、それが表す基になる型の演算子を使用するということですか?
持ち上げられたオペレーターに関する SO に関する情報はあまりないようです。
c# - 構造体を null と比較するときの間違ったコンパイラ警告
次のコードを検討してください。
Visual Studio 2010 (C# 4、.NET 4.0) では、次の警告が表示されます。
警告 CS0458: 式の結果は常に 'bool?' 型の 'null' です
これは正しくありません。結果は常にfalse
(タイプbool
):
ここで、構造体 DateTime は>
(より大きい) 演算子をオーバーロードします。Null 非許容の構造体 (DateTime など) は、対応するNullable<>
型に暗黙的に変換できます。上記の式は、
これも同じ間違った警告を生成します。ここで、>
オペレーターは持ち上げられたオペレーターです。HasValue
これは、2 つのオペランドのいずれかが である場合に false を返すことによって機能しますfalse
。それ以外の場合、リフトされた演算子は 2 つのオペランドを基になる構造体にアンラップし、その構造>
体によって定義された のオーバーロードを呼び出します (ただし、一方のオペランドがそうでない場合、これは必要ありませんHasValue
)。
このバグを再現できますか? また、このバグはよく知られていますか? 私は何かを誤解しましたか?
これは、問題の演算子をオーバーロードするすべての構造体型 ( のような単純な型int
ではなく、列挙型ではない) で同じです。
(ここ==
で の代わりに使用すると>
、すべてが完全に似ているはずです (DateTime も==
演算子をオーバーロードするため)。しかし、似ていません。
警告が表示されない☹ 変数の型が struct (オーバーロード==
され、 のような単純な型ではないint
) であることを認識せずに、誤って変数またはパラメーターの null をチェックする人を時々見かけます。警告が出た方がいいです。)
更新: Visual Studio 2015の C# 6.0 コンパイラ ( RoslynベースisGreater
上記の誤ったメッセージが CS0464 に変更され、正しい有用な警告メッセージが表示されます。また、isEqual
上記の警告の欠如は VS2015 のコンパイラで修正されていますが、/features:strict
.
c# - ユーザー定義の演算子で裸の null リテラルを使用する場合の奇妙なオーバーロードの解決
TimeSpan
(タイトルの「ユーザー定義」とは、 と の加算と減算が C# 標準の一部ではないという事実を指しDateTime
ます。それらは BCL で定義されています。)
nullableTimeSpan
とDateTime
値の持ち上げられた演算子をいじって、次のコードを書きました。フレームワークは と で異なる操作を提供することに注意してTimeSpan
くださいDateTime
。
TimeSpan
2 つを取り、 sum を返す、1 つの対称 (および可換) 加算がありますTimeSpan
。この加算の「逆」は、TimeSpan
を生成する2 の減算ですTimeSpan
。
次に、別の種類の加算、非対称があります。ここでは、1 つDateTime
(左オペランド) と 1 つTimeSpan
(右オペランド) を使用して を生成しDateTime
ます。この演算は非対称であるため、2 つの「種類」の逆行列があります。1 つDateTime
は互いに 2 を減算してTimeSpan
差を求めるもの、もう 1 つは 1 を取り、そこから 1DateTime
を減算してTimeSpan
結果を生成するものDateTime
です。
自然にいくつかの疑問が生じます。
o
許可されているのにint?
(ちなみに a ではないのはなぜlong?
ですか?) whileg
が許可されていないのは少し奇妙です。これは仕様でしょうか?あと、文字列連結で「ありえない」c
が解消されるのもちょっと不思議。どうやらコンパイラはnull
inc
が(string)null
. 一方、明示的な型の式object
を aに追加すると、コンパイルされません。DateTime
しかし、私の主な質問は、コンパイラがandのオーバーロードを選択できるのはなぜですか?d
l
m
c# - 2 つの null nullable の比較
C# 5.0 仕様は、7.1.3 章で読み取ります
https://msdn.microsoft.com/en-us/library/ms228593.aspx
false
一方または両方のオペランドがの場合、持ち上げられた演算子は値を生成しますnull
。
ただし、テストとこの MSDN リンクも
http://msdn.microsoft.com/en-us/library/2cf62fcy(v=vs.100).aspx
null
は、どちらも を返す2 つの null 許容値を比較することを示していますtrue
。
理にかなっていますが、仕様の文と矛盾していますね。