問題タブ [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.

0 投票する
4 に答える
826 参照

c# - System.Nullablenull * int値の値は何ですか?

次のステートメントを検討してください。

の値は v2? (nullまたは空の文字列?)

コンパイラが無効な操作としてマークするのを防ぐにはどうすればよいですか? カスタム例外処理に従う必要がありますか?

0 投票する
2 に答える
13082 参照

c# - 持ち上げられた演算子とは何ですか?

私はこの記事を見ていましたが、持ち上げられた演算子を説明する VB.NET の例に従うのに苦労しています。同等の C# の例やチュートリアルはないようです。私は一般的に演算子のオーバーロードの経験があまりないので、null 許容型を読みながら VB.NET の同等物に慣れようとすることは、おそらく開始するのに最適な場所ではありません...

持ち上げられた演算子の説明と、それらが null 許容型でどのように使用されるかを説明できる人はいますか? null許容型自体は演算子をオーバーロードせず、それが表す基になる型の演算子を使用するということですか?

持ち上げられたオペレーターに関する SO に関する情報はあまりないようです。

0 投票する
3 に答える
1073 参照

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.

0 投票する
1 に答える
131 参照

c# - ユーザー定義の演算子で裸の null リテラルを使用する場合の奇妙なオーバーロードの解決

TimeSpan(タイトルの「ユーザー定義」とは、 と の加算と減算が C# 標準の一部ではないという事実を指しDateTimeます。それらは BCL で定義されています。)

nullableTimeSpanDateTime値の持ち上げられた演算子をいじって、次のコードを書きました。フレームワークは と で異なる操作を提供することに注意してTimeSpanくださいDateTime

TimeSpan2 つを取り、 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が解消されるのもちょっと不思議。どうやらコンパイラはnullinc(string)null. 一方、明示的な型の式objectを aに追加すると、コンパイルされません。DateTime

しかし、私の主な質問は、コンパイラandのオーバーロードを選択できるのはなぜですか?dlm

0 投票する
2 に答える
114 参照

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

理にかなっていますが、仕様の文と矛盾していますね。