問題タブ [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# - 同等の暗黙の演算子:なぜそれらは合法ですか?
アップデート!
以下のC#仕様の一部の私の分析を参照してください。この質問で説明している動作は実際には仕様に違反しているように見えるので、何かが足りないに違いないと思います。
アップデート2!
OK、さらに考えてみると、いくつかのコメントに基づいて、私は今何が起こっているのか理解していると思います。仕様の「ソースタイプ」という言葉は、変換元のタイプを指します。つまり、Type2
以下の例では、コンパイラが候補を定義された2つの演算子に絞り込むことができることを意味します(Type2
ソースタイプであるため)。両方のための)。ただし、これ以上選択肢を絞り込むことはできません。したがって、仕様のキーワード(この質問に適用される)は「ソースタイプ」です。これは、以前は「タイプの宣言」を意味すると誤解していました(私は思います)。
元の質問
これらのタイプを定義したとします。
次に、私がこれを行うと言います:
implicit
どの演算子を使用すべきかが明確でないため、これは明らかにあいまいです。私の質問は-このあいまいさを解決する方法がわからないので(どのバージョンが必要かを明確にするために明示的なキャストを実行できるわけではありません)、それでも上記のクラス定義はコンパイルされます-なぜコンパイラは許可するのでしょうかそれらの一致するimplicit
演算子はまったく?
解剖
OK、これを理解するために、Hans Passantが引用したC#仕様の抜粋を見ていきます。
ユーザー定義の変換演算子が考慮されるタイプのセットDを見つけます。このセットは、S(Sがクラスまたは構造体の場合)、Sの基本クラス(Sがクラスの場合)、およびT(Tがクラスまたは構造体の場合)で構成されます。
(S)から (T )に変換しています。したがって、ここでDには、例の3つのタイプすべてが含まれているようです:(これはSの基本クラスであるため)、(T)、および(S)。Type2
Type1
Type0
Type1
Type2
該当するユーザー定義の変換演算子Uのセットを見つけます。このセットは、Sを含む型からTを含む型に変換する、Dのクラスまたは構造体によって宣言されたユーザー定義の暗黙的な変換演算子で構成されます。Uが空の場合、変換は未定義であり、コンパイル時エラーが発生します。
さて、これらの条件を満たす2つの演算子があります。で宣言されたバージョンは、がDであり、(明らかにSを含む)から(明らかにTを含む)に変換されるType1
ため、要件を満たしています。のバージョンも、まったく同じ理由で要件を満たしています。したがって、Uにはこれらの演算子の両方が含まれます。Type1
Type2
Type1
Type2
最後に、 Uの演算子の最も具体的な「ソースタイプ」SXを見つけることに関して:
Uの演算子のいずれかがSから変換される場合、SXはSです。
これで、Uの両方の演算子がSから変換されます。これにより、 SXがSであることがわかります。
Type2
これは、そのバージョンを使用する必要があるという意味ではありませんか?
ちょっと待って!よくわかりません!
演算子のバージョンのみを定義することはできませんでしType1
た。その場合、残りの候補はType1
のバージョンのみになりますが、仕様によればSXは次のようになりType2
ますか?これは、仕様で不可能なことが義務付けられている可能性のあるシナリオのようです(つまり、で宣言された変換はType2
、実際には存在しない場合に使用する必要があります)。
c++ - デフォルトのコンストラクタ
'Base' の既定のコンストラクター (暗黙的) が抑制されているため、示されているコードはエラーを返します。確かに、標準は$ 12.1と言っています"If there is no user-declared constructor for class X, a default constructor is implicitly declared."
次の 3 つのことがあります。
a) ユーザーが宣言したコンストラクターがクラスに存在する場合、デフォルトのコンストラクター (暗黙的) が抑制されると標準はどこでも述べていますか? それは基本的に上記の否定的な言い回しですか、それとももう一度暗示されています:)?
b) なぜそのようになったのですか?
c) デフォルトのデストラクタに同じ規則が適用されないのはなぜですか?
c# - 割り当てなしの暗黙の変換?
保存された質問 - 下部の編集を参照してください
。基本的に、基本的な循環的複雑さを隠すことで読みやすさを提供するために、小さな機能ライブラリに取り組んでいます。プロバイダーが呼び出されSelect<T>
( と呼ばれるヘルパー ファクトリSelect
を使用)、使用法は次のようになります。
ライブラリが短絡などを処理します。 からSelect<T>
への暗黙的な変換も追加したT
ので、次のように記述できます。
私が本当にできるようにしたいのは、割り当てなしの T への暗黙的な変換です。
ただし、指定された構文は機能しません。変数に割り当てるか、明示的にキャストする必要があります。暗黙のキャストをインラインで取得する方法はありますか?
編集
私がやりたいことはこれです:
scala - 暗黙の値が見つかりません
コンパイラが不平を言う理由:
エラー: パラメータ マップの暗黙的な値が見つかりませんでした: scala.collection.mutable.Map[String,T] names.foreach(createEntity[T])
?
vb.net - 明示的(名前付き)名前空間と暗黙的(グローバルまたはルート)名前空間に関するVB.NET名前空間の問題
すべて同じルート名前空間を使用する多くのプロジェクトを含むソリューションがあります。名前空間に明示的に名前を付けるコードファイルはありません。したがって、ルート名前空間がであるとしましょうExampleRootNamespace
。
作業中のコードファイルの1つに明示的に名前が付けられた名前空間を追加したい場合、問題が発生します。このコードをアセンブリの残りの部分から分離して、FxCopを実行できるようにしたいと思います。Namespace Interfaces.CSV
だから私はコードファイルに何かのようなものを追加します。
これにより、このアセンブリを参照するコードはすべて、と言う必要がありますImports ExampleRootNamespace.Interfaces.CSV
。ここまでは順調ですね。アセンブリに対してFxCopを実行することもできます。現在の問題は、他のアセンブリでは、次のようなことはもう言えないということです。
Visual Studioから、名前空間の名前を次のように変更するように求められます。
これに関連する何百ものエラーがあります。だから私の質問は:
1)基本的に、ルートの下で名前空間に初めて名前を付けると、プログラムで問題が発生するのはなぜですか?
2)名前を変更せずにこの問題の回避策はありますか?
ExampleRootNamespace.Interfaces.CSV
また、コードベースのどこにもこれを参照していないという点で、これを追加したいと思います。私は現在、単体テストプロジェクトからそれを参照しています。したがって、この名前空間を追加すると問題が発生する理由がわかりません。
scala - より高い種類の型の暗黙的なパラメーター解決
次のコードを検討してください。
これは機能しますが、Some(42) を Option[Int] として入力する必要があります。そうしないと、暗黙的なオブジェクト OptionBar が解決されません (代わりに Bar[Some] が必要になるため)。明示的な入力を回避する方法はありますか? Some または None でテストをフィードしても、テストで暗黙の OptionBar オブジェクトを取得できますか?
【説明】
Bar
ここではオプションを例として使用しましたが、抽象クラスなどの場合にも機能するはずです。- このソリューションは、他の関係のないバーが範囲内にある場合にも機能するはずです。
implicit object listBar extends Bar[list]
[アップデート]
Bar のパラメーターを反変にすることでうまくいくようです。
しかしもちろん、これは Bar の可能性の深刻な制限であるため、私はまだより良い答えを望んでいます.
c++ - 複数の引数を持つコンストラクターを介した暗黙的なキャスト
これらの2つのコンストラクターがある場合MyClass
:
およびオーバーロードされた(非メンバー)operator+
:
これにより、次のようなコードを記述できます。
定義されたコンストラクターを介した暗黙のキャストを使用していると思いますが、正しいですか?
コンストラクターが2つの引数を取ることで、この暗黙のキャストを行う方法はありますか?コードは次のようになります。
?
または、{9、4}からMyClass
オブジェクトへの明示的なキャストを行うだけですか?
scala - Scala: 暗黙の変換は Any で機能しますか?
異なる型階層のいくつかのオブジェクトを、List[Any]
または同様のコンテナーに格納したいのですが、後で暗黙的な変換を実行して、型クラスのようなことを行います。以下に例を示します。
上記のコードは、次のようにエラーをスローします。
のコメントを外すと、 が表示されAnyPrices
ますがList(0,0)
、それは私が期待しているものではありません。これを機能させるには、マニフェストをリストに保存する必要がありますか?
また、それが欲しくて十分ではないList(Prius(2010)) map { implicitPrice(_) }
ため、どちらも機能しません。より柔軟にする方法はありますか?Price[Prius]
Price[Car]
scala - Scala:一般的な暗黙のコンバーター?
type のすべてのサブタイプで機能する汎用の暗黙的なコンバーターを定義したいと思いますT
。例えば:
上記のコードはエラーをスローします。
私は何を間違っていますか?
更新:
@extemporeが指摘したように、間違っているのは、暗黙の変換 (ビュー境界) とコンテキスト境界 (両方とも暗黙のパラメーターを使用する) を混同していることです。私の一般的な暗黙のコンバーターには何の問題もありません。問題はadd
、ビューの代わりにコンテキスト境界を使用していることです。したがって、次のように修正できます。
@extempore が彼のコードで示している興味深いことは、Price[A]
反変である場合、一般的なコンバーターは実際には必要ないということです。基本的に、私はPrice[Car]
に代わって仕事をすることができますPrice[Prius]
。これは私が望んでいたことの一種です。したがって、代替のコンテキスト バインド バージョンは次のとおりです。
関連:
scala - Scalaでの過負荷解決のこの制限を回避するにはどうすればよいですか?
Scalaでは、オーバーロードと暗黙の引数解決の相互作用により、次のコードを使用可能にすることが不可能になっているようです。
ここでの目標は、Bijection [A、B]またはBijection [B、A]が暗黙のスコープで使用可能かどうかに関係なく、a.as[B]がタイプセーフな変換を実行することです。
これが機能しない理由は、コンパイラでのオーバーロードの曖昧性解消の後に暗黙の解決が行われるように見えるためです。また、「as」の両方の実装は同じ結果タイプであるため、コンパイラはそれを見つけようとさえしません。適切な暗黙が変換を実行できるスコープ内にあるかどうか。要するに、暗黙の解決は過負荷の曖昧性解消には使用されません。
'as'をオーバーロードしたい理由は、このライブラリのユーザーが呼び出しサイトで全単射の「方向」をエンコードする必要がないようにするためです。明らかに、Bijectを次のように実装できます。
しかし、これは本質的にポン引きを不要にするため、本当に魅力的ではありません。明示的に全単射を通過させることもできますが、もちろん、使用される全単射をスコープに基づいて変化させることはできなくなります。
この問題に対する良い解決策はありますか?