問題タブ [implicit]
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# - 暗黙の変換から例外をスローする言い訳はありますか?
MSDNから:
不要なキャストを排除することで、暗黙的な変換によってソース コードの読みやすさが向上します。ただし、暗黙的な変換はプログラマが指定しなくても発生する可能性があるため、不愉快な驚きを避けるために注意する必要があります。一般に、暗黙的な変換演算子は、プログラマーが意識しなくても安全に使用できるように、決して例外をスローしたり、情報を失ったりするべきではありません。変換演算子がこれらの基準を満たさない場合は、明示的とマークする必要があります。
私は特定の点に同意しませんが、これはすべて非常に良いことに同意しますが、暗黙の変換が例外をスローしないという部分を破るのに十分な理由はありますか?
私の前にある特定のケースは、次の場合です。
- カスタム コレクション オブジェクトを返す関数があります (これを と呼びます
FooCollection
)。 - この関数は、単一のアイテムを持つコレクションを返すことができ、これが発生するかどうかはソース コードから判断できます。(これは、関数自体ではなく、関数呼び出しのみを意味します)
- それが起こった場合、ユーザーが 1 つのアイテムのコレクションではなく、その 1 つのアイテムを望んでいる可能性は 99.9% です。
FooCollection
ここで、 =>からの暗黙的な変換を含めて、Foo
この小さな実装の詳細を隠すかどうかを検討していますが、この変換は、コレクションに単一のアイテムがある場合にのみ機能します。
Exception
この場合投げても大丈夫ですか?または、代わりに明示的なキャストを使用する必要がありますか? これに対処する方法について他のアイデアはありますか (いいえ、実装の詳細のため、2 つの関数だけを使用することはできません)。
編集:FooCollection
インターフェイスを実装していないか、名前が示すように実際に拡張していないことに注意する価値があると思いますCollection
。したがって、LINQベースの回答は役に立ちません。また、コレクションは数値インデックスを実装していますが、ほとんどが名前付きインデックスに依存しているため、コレクションを処理する最も直感的な方法ではありません。
scala - Scala Implicit 変換: 2 つの呼び出し方法
@lucastexが Java Elvis 演算子について投稿したので、同じ効果を得るために Scala で何かを試しました。
?:
演算子が引数と同じ型のオブジェクトを取ることで、すべてを新しい構造型に変換しました。だから、言って:
なぜname ?: "Lucas"
取得"Lucas"
してname.?:{"Lucas"}
取得するのPaulo
ですか?新しい構造型は、 nullでない場合、つまり"Paulo"
上記のコードの場合、すべての初期値を返すことになっています。
私は少し混乱しています。説明はありますか?
c++ - C++ の bool への暗黙的な変換
列挙型をよりタイプセーフにするために、マクロで生成されたオーバーロードされた演算子を使用して、列挙型を同じ型の列挙型以外と比較できないようにしました。
これは通常、望ましい効果があります。フォームの比較はcolor_variable == RED
機能しますが、フォームの比較はBoost.StaticAssertcolor_variable == 1
のおかげでコンパイル時エラーを生成します。(これはまともなアプローチですか?)
ただし、私のコンパイラ (CodeGear C++Builder) も、これらのオーバーロードされた演算子を使用して暗黙的bool
な変換を実装しようとしています。たとえば、if (color_variable) { ... }
に変換されif (operator!=(color_variable, 0)) { ... }
て がトリガーされ、BOOST_STATIC_ASSERT
コンパイルに失敗しています。
これは私のコンパイラ側の間違った動作であると確信しています (たとえば、Comeau と GCC はそれを行いません)。自分で C++0x ドラフト標準を調べてみましたが、セクション 4.12 の下にある次のステートメントしか見つかりませんでした。
ゼロ値、NULL ポインター値、または NULL メンバー ポインター値は false に変換されます。その他の値は true に変換されます。
「ゼロ値」がどのようにチェックされるかについての詳細なし。
c# - 暗黙の演算子-いつそれが良い/悪い考えですか?
私は方向(前方/後方)の概念が非常に重要なアプリケーションに取り組んでいます。
問題は、コードベース全体に広がるいくつかの異なる規則があることです。ある場所ではそれがtrue / falseであり、他の場所では+ 1/-1です。
これをまとめるために、私は次のものを作成しました。
私は今、暗黙の変換が良いアイデアなのか悪いアイデアなのか疑問に思っています。
そして、私が奨励する可能性が高い古典的な落とし穴があるかどうか。
c# - C#3.0では、文字列クラスに暗黙の演算子を追加することは可能ですか?
何かのようなもの
それで :
scala - どの暗黙的な変換がデフォルトで使用されるかを制御する方法はありますか?
私がこれを持っているとしましょう:
これを暗黙的に追加すると、次のようになります。
stringWrapper もこれを暗黙的に追加するため、コンパイル エラーが発生します。String2
オブジェクトをインスタンス化してそれに取り組む必要がないように、コンパイラに「他の暗黙を無視して、これを使用してください」と言う方法はありますか?
サンプルコードが(この質問に対して)最も適切ではないかもしれないことは認めますが、そうすると思います。
vb.net - 暗黙の VB パフォーマンスの問題
場合によっては、インターフェースを実装するか、基本メソッドがオブジェクトを期待する仮想 (MustInherit) を継承する必要がありますが、たとえば、渡す値は常に整数になることがわかっています。
以下の例から最高のパフォーマンスを得るにはどうすればよいですか:
考慮事項:
- オプション 1: キャストはありませんが、適切ではない可能性があります。パフォーマンスのコストは低くなりますか?
- オプション 2: 型がわかっている場合にキャストしますが、より安全だと感じます。
注:「なぜ別の方法で実装したくないのか」などとコメントしないでください。私の質問はこれを行う方法ではありません。質問する方法の例が見つかりませんでした、私の質問どのオプションが正しいか、そして何がより多くのパフォーマンスを犠牲にするかです。
c# - 暗黙的な変換での文字列定数の使用
次のコードを検討してください。
しかし、可能であれば、次のことができるようにしたいと考えています。
TextType の暗黙的な演算子のオーバーロードを使用して String クラスを拡張することはできませんが、リテラル文字列を別のクラス (メソッドまたは何かによって処理される) に割り当てる方法はありますか?
文字列は参照型であるため、C# を開発したとき、クラスに文字列リテラルを取得するために何らかの方法を使用する必要があったことは明らかです。言語にハードコーディングされていないことを願っています。
c - プロトタイプのない古いスタイルの関数を使用したCコンパイラの動作
私のプログラムが2つのファイルで構成されている場合:
main.c
func.c
コンパイラはエラーを表示しません。
プログラムが1つのファイルのみで構成されている場合:
main.c
Visual C ++ 2008コンパイラは、次のエラーを表示します。
誰かがこの奇妙な行動を説明できますか?
c++ - C++のコンストラクターでの数値型の暗黙的なキャストの防止
次の形式のコンストラクターがあります:
MyClass(int a、int b、int c);
そしてそれはこのようなコードで呼び出されます:
MyClass my_object(4.0、3.14、0.002);
このdoubleからintへの自動変換を防止するか、少なくともコンパイル時に警告を受け取りたいと思います。
この場合、「explicit」キーワードは機能しないようですよね?