問題タブ [implicit-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++ - Getting rid of error C2243
Is it possible to getting rid of error C2243?
I had this error in my app and at the end I've managed to compile it by making an explicit conversion:
I can't understand why by making class D inherited protected from B makes the implicit conversion inaccessible.
I tried to avoid explicit conversion by creating a operator B() in class D in order to make the conversion accessible:
But there is no way.
Any other solution to avoid explicit conversion?
c# - 暗黙のキャスト演算子を使用したランタイムInvalidCastException
内部クライアントがVB.Netで構成するC#ライブラリがあります
InvalidCastException
彼らのスクリプトは、彼らが本当にすべきではない場所を投げています。
したがって、コードは次のようになります(大幅に簡略化されています)。
次に、VB.Netで(これも大幅に簡略化されています):
暗黙的/拡大演算子内にブレークポイントを追加すると、到達しません。
暗黙の演算子を削除すると、コンパイルされません。
C#で同等のステートメントを実行すると:
奇妙な-VB.netコンパイラはキャスト演算子を見つけることができるように見えますが、実行時に失われます。確かに、VBとC#ILはここでかなり似ていますか?
VB.netコードは動的にコンパイルされます。コンパイルは、ユーザーがアプリに初めてログインしたときに行われます。.Net 3.5に対してVB.Netとしてコンパイルされており、COM相互運用機能を使用していません。
何か案は?
c# - どのJsonデシリアライザーがIListをレンダリングするかコレクション?
コレクションが型として表されるオブジェクトモデルにjsonを逆シリアル化しようとしていIList<T>
ます。
実際の逆シリアル化はここにあります:
例外を投稿する前に、暗黙の変換が何であるかを知っておく必要があります。これはContact
タイプです:
そしてこれはContactDetail
タイプです:
で知っておくべき重要なことLazyList<T>
は、それが実装しているということIList<T>
です:
LazyList<T>
これで、 Jsonを逆シリアル化しようとするまで、このクラス定義は問題ありませんでした。は、その年齢の意味のあるSystem.Web.Script.Serialization.JavaScriptSerializer
リストをシリアル化したいと思っているようですが、それらが私の中にキャストされるように、タイプでそれらが必要です(少なくともそれは私が間違っていると思うところです)。List<T>
IList<T>
LazyList<T>
この例外が発生します:
List<ContactDetail>
私が私のタイプで使用しようとするContact
と(上記のコメントを見ることができるように)、それはうまくいくようです。しかし、私はを使いたくありませんList<T>
。LazyList<T>
実行しているように見える継承を試してみましたが、内部を実装にList<T>
渡すのは悪夢であり、モデルのどこにも肥大化したくないだけです。List<T>
T[]
List<T>
また、他のいくつかのjsonライブラリを無駄に試しました(これらを最大限に活用していない可能性があります。多かれ少なかれ参照を置き換えて、この質問の上部に引用されているコードを繰り返してみました。おそらく、settingsparamsを渡すとヘルプ??)。
今何をしようかわからない。別のデシリアライザーを使用しますか?デシリアライズ自体を微調整しますか?デシリアライザーを満足させるためにタイプを変更する必要がありますか?暗黙のキャストについてもっと心配する必要がありますか、それとも単に別のインターフェイスを実装する必要がありますか?
c++ - C++演算子のオーバーロードと暗黙の変換
いくつかの算術演算、たとえば固定小数点計算をカプセル化するクラスがあります。算術演算子をオーバーロードするというアイデアが好きなので、次のように記述します。
それはすべて機能します。3 * CFixed(0)とCFixed(3)*10.0fと書くことができます。しかし、今では、整数オペランドを使用した演算子*をはるかに効果的に実装できることに気付きました。だから私はそれをオーバーロードします:
それでも機能しますが、CFixed(0)* 10.0fはオーバーロードされたバージョンを呼び出し、floatをintに変換します(floatをCFixedに変換することを期待していました)。もちろん、floatバージョンをオーバーロードすることもできますが、私にとってはコードの組み合わせ爆発のようです。回避策はありますか(またはクラスの設計が間違っていますか)?オーバーロードされたバージョンのoperator*をintのみで呼び出すようにコンパイラに指示するにはどうすればよいですか?
c# - 三項ステートメントでの暗黙的な int -> short 変換はありません
これは失敗します:
エラー CS0266: 型 'int' を 'short' に暗黙的に変換することはできません。明示的な変換が存在します (キャストがありませんか?)
なぜそうなのか、誰か説明できますか?私が考えることができる唯一のことは、次のようなものを書いた場合、コンパイラは2番目の値を見ておらず、2つの間の範囲を知らないということです.
正しい?唯一の修正は醜いキャストですか?
また、C# には short 型の型サフィックスがないようです。それはかなり重大な見落としです。そうでなければ、それは解決策だったでしょう...
c# - システムタイプ; 文字列への暗黙のキャスト
コード定義ウィンドウでSystem.Typeクラスを見ていると、このクラスのインスタンスが暗黙的に文字列にキャストされる方法を理解できないようです。たとえば、次のコードでは次のようになります。
GetType()の結果であるSystem.Typeは、暗黙的に文字列にキャストされましたか?
c++ - 暗黙的な変換を使用してC++関数テンプレートのインスタンス化をシミュレートします
私はすでに、自分がやろうとしていることに関連する2つの 質問をしました(1つは解決し、もう1つはまもなく終了します)。C ++テンプレートのインスタンス化では暗黙的な変換が許可されないことは知っていますが(たとえば、このコメントを参照)、それをシミュレートしたいと思います。
次のスケルトンコードがあるとします。
関数のテンプレートパラメータf
を常にBase_A
またはの派生クラスにしたいAdapter
。のタイプを制限するための答えはarg
実行できますが、アダプタへの暗黙の変換は実行できません。これを行う方法はありますか?f
最終的な結果は、f(A)
またはを呼び出すことができるようにしたいということですf(B)
。どちらの場合も、AまたはBの実際の派生型を知る必要がありますf
(f
基本クラスへの参照だけを見ることができません)。
脇:
現在、f(A)
作業中です。f(B)
実際には、アダプターの構築を実行するオーバーロードを呼び出しますが、N個の引数を取り、それぞれがAまたはBになる可能性がある他の関数があるため、2^N個のオーバーロードが必要になります。
不思議なことに、これは私が取り組んでいるマトリックスライブラリに適用されています。Base_A
基本マトリックスタイプをBase_B
表し、基本マトリックスビュータイプを表します。行列の引数を変更する操作の場合、非const参照によって行列を渡すか、const-refによって変更可能な行列ビューを渡す必要があります。アダプターは、単純なマトリックスからビューへのアダプターです。たとえば、私は現在、次のような機能を持っています
ビューと非ビューの両方を処理するために必要なオーバーロードを作成するためだけに、これらすべての関数の2^Nコピーを作成するのは面倒でエラーが発生しやすくなります。現状では、Mviewに依存する型のインスタンスを生成する可能性があるため、Scaleが基本クラスだけでなくMviewの完全な派生型を認識できるようにしたいので、これでは十分ではありません。
編集1:すべてのBタイプを非constインターフェース機能を持つように変更しました。これが本来の意図でしたので、ご迷惑をおかけしましたことをお詫び申し上げます。
編集2:この動作するコードを持っていて、それでも2 ^ Nのオーバーロードが必要ですが、誰かがそれに対処する方法を提案しない限り、私はそれで生きることができます。
c++ - C++テンプレートとあいまいさの問題
次のようなポインタクラスのサブセットがあります。
最後のコンストラクターの目標はPointer
、サブクラスの、または基本的に暗黙的にに変換可能な任意の型を渡すことができるようにすることT *
です。この実際のルールは、コンストラクターの定義によってのみ適用され、コンパイラーは宣言だけで実際にそれを理解することはできません。Pointer<Sub>
それを削除し、のコンストラクターにを渡そうとすると、パスを通過するPointer<Base>
可能性があるにもかかわらず、コンパイルエラーが発生しますoperator T *()
。
上記の問題を解決しながら、別の問題を作成します。Pointer<UnrelatedClass>
一方のオーバーロードがaを取り、もう一方がをとるオーバーロードされた関数があり、それPointer<BaseClass>
をで呼び出そうとするとPointer<SubClass>
、もちろん、後者のオーバーロードが呼び出されることを意図して、2つのオーバーロードの間にあいまいさが生じます。
助言がありますか?(うまくいけば、私は十分に明確でした)
asp.net-mvc - 暗黙のキャスト演算子が定義されている場合でも、無効なキャスト例外 (asp mvc アプリで)
MVC モデル クラスを作成しましたが、プロパティの 1 つは「MyObject」タイプです。System.ComponentModel.DataAnnotations.StringLength 属性もあります。
MyObject は暗黙のキャスト演算子として使用されるため、基本的に文字列として使用できます。
これは何らかの奇妙な理由で asp mvc の問題ですか? ほとんどの場合、暗黙的なキャストが正常に機能することを知っているため、たとえば、そのプロパティを文字列値に割り当てることができ、正常に機能します。
編集 - OK、エラーが発生する理由はわかっています:
StringLength.IsValid() メソッドがオブジェクトをパラメーターとして受け取るため、キャストは実際には MyObject から文字列ではなく、オブジェクトから文字列に移動するためです。暗黙のキャスト演算子が呼び出されていません。しかし、これを回避するにはどうすればよいでしょうか。
モデルのプロパティに System.ComponentModel.DataAnnotations.StringLength 属性を配置するまで、これはすべて正常に機能し、ビューが送信ボタンから投稿すると、例外が発生しました。
[InvalidCastException: タイプ 'StrataSpot.Shared.Models.Email' のオブジェクトをタイプ 'System.String' にキャストできません。]
System.ComponentModel.DataAnnotations.StringLengthAttribute.IsValid(オブジェクト値) +34
System.Web.Mvc.d__1. MoveNext() +56 System.Web.Mvc.DefaultModelBinder.OnPropertyValidated(ControllerContext controllerContext、ModelBindingContext bindingContext、PropertyDescriptor propertyDescriptor、オブジェクト値) +203 System.Web.Mvc.DefaultModelBinder.BindProperty(ControllerContext controllerContext、ModelBindingContext bindingContext、PropertyDescriptor propertyDescriptor) +413
System.Web.Mvc.DefaultModelBinder.BindProperties(ControllerContext controllerContext、ModelBindingContext bindingContext) +90
System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel(ControllerContext controllerContext、ModelBindingContext bindingContext、オブジェクト モデル) +383
System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext、ModelBindingContext bindingContext) +1048
System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext ) controllerContext、ModelBindingContext bindingContext) +280
System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext、ParameterDescriptor parameterDescriptor) +257
System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext、ActionDescriptor actionDescriptor) +109
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +314 System.Web.Mvc.Controller.ExecuteCore() +105 System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +39
System.Web. Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +7
System.Web.Mvc.<>c__DisplayClass8.b__4() +34 System.Web.Mvc.Async.<>c__DisplayClass1.b__0() + 21 System.Web.Mvc.Async.<>c__DisplayClass81.<BeginSynchronous>b__7(IAsyncResult _) +12 System.Web.Mvc.Async.WrappedAsyncResult
1.End() +59 System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +44
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest( IAsyncResult 結果) +7
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8678910 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155