問題タブ [explicit-conversion]
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.ComponentModel.DataAnnotation.dll)
ドメインモデルで使用されるカスタムLocalizedStringタイプがあります。のような検証属性でプロパティを装飾したいと思いますMaxLength
。このために、この属性に必要なキャストを有効にする暗黙の演算子を追加しました。
IsValid
不思議なことに、演算子が呼び出されることはなく、属性メソッドでInvalidCastExceptionがスローされるようです。私たち自身のプロジェクトでこのキャストを実行することはうまくいきます。
このシステムのclrngen'ed属性などで、特別なキャスト動作コンパイラマジックが実行されていますか?
ご協力いただきありがとうございます。
編集
c++ - C ++複数演算子=()
私はStringクラスを書いています。次のような文字列を割り当てられるようにしたいと思います。
文字列から整数への変換には、operator =()メソッドをすでに割り当てています。逆のメソッドを実行できるように、別のoperator =()を宣言するにはどうすればよいですか?
私が別のものを宣言するとき、それは前のものを上書きするようです。
c# - C# で (明示的または暗黙的な) 変換演算子をいつ定義する必要がありますか?
C# のあまり知られていない機能は、暗黙的または明示的なユーザー定義の型変換を作成できることです。私は C# コードを 6 年間書いていますが、一度も使用したことがありません。そのため、良い機会を逃してしまうのではないかと心配しています。
ユーザー定義の変換の正当で有効な使用法とは? カスタム メソッドを定義するよりも優れている例はありますか?
--
Microsoft には、変換に関するいくつかの設計ガイドラインがあり、最も関連性の高いものは次のとおりです。
エンド ユーザーがそのような変換を明確に期待していない場合は、変換演算子を提供しないでください。
しかし、コンバージョンが「期待される」のはいつでしょうか? おもちゃの数のクラス以外では、実際のユースケースを理解できません。
回答で提供されている例の要約を次に示します。
- ラジアン/度/ダブル
- 極座標/Point2D
- ケルビン/華氏/摂氏
パターンは次のように思われます: 暗黙的な変換は、数値/値型を定義するときにほとんど (のみ?) 有用であり、変換は式によって定義されます。振り返ってみると、これは明らかです。それでも、非数値クラスも暗黙の変換の恩恵を受けることができるのだろうか..?
c++ - isSet() または演算子 void*() または明示的な演算子 bool() または何か他のもの?
値が設定されているかどうかをチェックする関数の最新技術は何ですか?
たとえば、以下の反復子はセルを解析します。一部のセルには値が含まれており、他のセルは空です。
最も便利な方法は何ですか?
反射:
- 私の上司は理解していない
isset()
=> に改名isSet()
empty()
単一のセルだけでなく、コンテナー コレクションに関するものです :(operator void*
論理的な方法のようですが、C++11 ストリームでは非推奨ですexplicit operator
はまだサポートされていません(私のコードは古いコンパイラに準拠している必要があります)
私は読んでいます:
c++ - サードパーティ ライブラリで暗黙的な変換を拡張する
バックグラウンド
サードパーティのライブラリに次のようなコードがある場合
その後、次のように呼び出すことができます
質問
このライブラリを (サードパーティのコードを変更せずに) 拡張して、次のようなものを受け入れることは可能ですか?
書く必要は避けたい
上記は単純化されています。私の実際の例ThirdPartyFunction
では、ストリーム オペレーターでありThirdPartyClass
、ストリーム マニピュレーターとの対話を可能にする型ラッパーです。
c# - EntityFrameworkオブジェクトからの継承
データベースからの取得を設定しようとしています。EF(Entity Framework)オブジェクトemUser
と、emUserから継承する通常のクラスがありUser
ますが、いくつかの機能が追加されています。
何らかの理由で、UserはemUserから継承しますが、明示的に変換することはできません。私が使用しているコード:
emUserのラッパーを作成することはできUser
ますが、emUserに変更を加えるたびにラッパーを変更する必要があります。User
テクニカルサービスレイヤーとドメインレイヤーで使用されるクラスを区別するために使用したいと思います。
次のようなエラーメッセージが表示されます。
emUserをUserに変換できないのはなぜですか?
c++ - 暗黙の変換演算子
C++11 の可変個引数テンプレート機能を使用して、関数のすべての引数を出力したいと考えています。そして、私は次のことをしました:
それから私はそれをテストしようとします:
std::cout << '\'' << concatenate(1, 2, 3, 4, std::string("ololo"), "alala", 'o', 1.2, 1.2L, 1.2f) << '\'' << std::endl;
しかし、コードがエラーでコンパイルされない場合:
error: cannot bind 'std::basic_ostream<char>' lvalue to 'std::basic_ostream<char>&&'
c:\mingw\lib\gcc\mingw32\4.7.0\include\c++\ostream:600: error: initializing argument 1 of 'std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = concatenate]'
エラーの性質は何ですか? 結局、コンパイラは変換演算子を使用するしかありません。そうじゃない?
c++ - 「if(getline(fin、str)){}」はC ++ 11標準に準拠していますか?
C ++ 11標準を確認したところ、次の事実が見つかりました。
std::getline(fin, str)
basic_ios
クラスにメンバー関数があるオブジェクトを返しますexplicit operator bool() const;
このクラスには、 C++11より前
basic_ios
のメンバー関数はありません。operator void*() const;
if (getline(fin, str)) {}
ですから、標準適合ではないと思います。それは次のように書く必要があります
if (bool(getline(fin, str)){}
。(ただし、VC ++ 2012は、この使用法について警告を出します。つまり、void *を強制的にブール値にします)
私は正しいですか?
c# - ユーザー定義の変換がC#でどのように行われるか
ユーザー定義の変換が明示的および暗黙的に発生することを次のプログラムについて説明できる人はいますか?
明示的変換方法と暗黙的変換方法についての私のコメントも参照してください。
c# - C# は、構造型付けが存在しないことを完全に認識しているのに、なぜ構造型付けをからかうのですか?
今日、これが可能であることに驚きましたが、これについては前に議論しなければならないのではないかと心配しています。
コンパイラーは、上記の状況で明示的なキャストが存在することを (正しく?) 教えてくれます。そこに構造的なタイピングを感じて興奮しましたが、実行時に失敗することはありません。では、C# がここで役立つのはいつでしょうか? そのようなキャストが機能するシナリオはありますか? それが何であれ、コンパイラは技術的にそうでmyAdder
はないことを事前に知っていると確信しています。ICanAdd