問題タブ [covariance]

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 投票する
14 に答える
76305 参照

c# - C# では、リストを作成できないのはなぜですか?オブジェクトはリストに格納されます variable

It seems that a List object cannot be stored in a List variable in C#, and can't even be explicitly cast that way.

List<string> sl = new List<str

It seems that a List object cannot be stored in a List variable in C#, and can't even be explicitly cast that way.

results in Cannot implicitly convert type System.Collections.Generic.List<string> to System.Collections.Generic.List<object>

And then...

results in Cannot convert type System.Collections.Generic.List<string> to System.Collections.Generic.List<object>

Of course, you can do it by pulling everything out of the string list and putting it back in one at a time, but it is a rather convoluted solution.


I'm personally not very big a fan of such puzzle questions, I prefer actual programming exercises in interviews.

That said, first it would depend on if I can tell if they are broken or not from the floor I am dropping them at. I will presume I can.

I would go up to the second floor, drop the first marble. If it broke I would try the first floor. If that broke I would know it was no floor.

If the first didn't break, I would go to the 4th floor and drop from there. If that broke, I would go back down and get the other marble, then drop at the 3rd floor, breaking or not I would know which is the limit.

If neither broke, I would go get both, and do the same process, this time starting at the 6th floor.

This way, I can skip every other floor until I get a marble that breaks.

This would be optimized for if the marble breaks early... I suppose there is probably an optimal amount of floors I could skip to get the most for each skip... but then if one breaks, I would have to check each floor individually from the first floor above the last known floor... which of course would be a pain if I skipped too many floors (sorry, not going to figure out the optimal solution right now).

Ideally, I would want a whole bag of marbles, then I could use a binary search algorithm and divide the number of floors in half with each drop... but then, that wasn't the question, was it?

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

c# - サブクラス固有のデータを格納する必要がある配列を継承する最良の方法は何ですか?

次のような継承階層を設定しようとしています。

MotorcycleAxle オブジェクトのみを Motorcycle オブジェクトの Axles 配列に格納し、CarAxle オブジェクトを Car オブジェクトの Axles 配列に格納したいと考えています。問題は、サブクラスの配列をオーバーライドしてどちらか一方を強制する方法がないことです。理想的には、Motorcycle クラスには次のようなものが有効です。

ただし、オーバーライドするときは型が一致する必要があります。このアーキテクチャをどのようにサポートできますか? Axles メンバーがアクセスされる場所で、多くの実行時の型チェックとキャストを行う必要があるだけですか? 実行時の型チェックを追加するのは好きではありません。強い型付けとポリモーフィズムの利点が失われ始めるからです。WheelAttached および Left/RightWheelAttached プロパティはタイプに依存するため、このシナリオでは少なくともいくつかの実行時チェックが必要ですが、それらを最小限に抑えたいと考えています。

0 投票する
17 に答える
1180 参照

c# - なぜ継承は私が思うように機能しないのですか?

クライアント実装を作成するためにすべてを一緒にオーバーライドする必要がある相互に関連する抽象クラスのグループがあるため、いくつかの継承の問題が発生しています。理想的には、次のようなことをしたいと思います。

これにより、Dogクラスを使用するすべての人が自動的にDogLegsを取得し、Animalクラスを使用するすべての人がLegsを取得できるようになります。問題は、オーバーライドされた関数が基本クラスと同じ型である必要があるため、これがコンパイルされないことです。DogLegは暗黙的にLegにキャスト可能であるため、なぜそうすべきでないのかわかりません。これを回避する方法はたくさんあることは知っていますが、C#でこれが不可能/実装されていない理由についてはもっと興味があります。

編集:コードで関数の代わりにプロパティを実際に使用しているため、これを多少変更しました。

編集:答えはその状況にのみ適用されるため、関数に戻しました(プロパティの集合関数の値パラメーターの共分散は機能しないはずです)。変動してすみません!私はそれが多くの答えを無関係に見えるようにすることを理解しています。

0 投票する
7 に答える
605 参照

c# - 継承されたメソッドの戻り値の型で共分散をサポートする言語は?

私は最初にこの質問をしましたが、答えを見つける際に、継承されたメソッドの戻り値の型の共分散に対する C# のサポートの欠如が私の元の問題であることがわかりました。それを発見した後、私はどの言語がこの機能をサポートしているのか知りたくなりました。

一番多く名前を挙げられる方の回答を受け付けます。

編集:ジョン・ミリキンは、多くの動的言語がこれをサポートしていることを正しく指摘しました。明確にするために:

静的/強く型付けされた言語のみを探しています。

0 投票する
9 に答える
8630 参照

c++ - ベクトルを取得するベクトルを期待する関数に

これらのクラスを検討してください。

この機能

そして最後に私のベクトル

derivedfunctionに渡したいのですBaseFooが、コンパイラが許可しません。ベクトル全体を a にコピーせずに、これを解決するにはどうすればよいstd::vector<Base*>ですか?

0 投票する
9 に答える
32118 参照

c# - 派生型でオーバーライドできますか?

私の知る限り、C#2.0で次のことを行うことはできません

派生クラスでプロパティを「新規」として作成することで問題を回避しますが、もちろんそれはポリモーフィックではありません。

2.0で何か解決策はありますか? この問題に対処する 3.5 の機能はどうですか?

0 投票する
5 に答える
1819 参照

.net - 汎用リストをインターフェイス/基本クラス型のリストにキャストする方法はありますか?

私は、彼らが作成したクレイジーな状況でのインターフェースの使用法を誰かに見せようとしています. リストには関連のないオブジェクトがいくつかあり、各オブジェクトの 2 つの文字列プロパティに対して操作を実行する必要があります。プロパティをインターフェイスの一部として定義すると、インターフェイス オブジェクトを、それに作用するメソッド パラメーターの型として使用できることを指摘しておきます。例えば:

これで問題ないように思えますが、作業が必要なリストは、インターフェイスを型パラメーターとして宣言する必要はありません (すべきではありません)。ただし、別の型パラメーターにキャストできるようには見えません。たとえば、これは失敗し、その理由がわかりません:

メンバーを使用してこれを行うことができEnumerable.Cast<T>ますが、.NET 2.0 でも機能するメソッドを探していました。これは可能であるように思われます。私は何が欠けていますか?

0 投票する
7 に答える
17665 参照

c++ - スマート ポインターで共変の戻り値の型を使用するにはどうすればよいですか?

次のようなコードがあります。

このコードはコンパイルされません。

ビジュアルスタジオで上げる

C2555: 仮想関数の戻り値の型のオーバーライドが異なり、共変ではありません

生のポインターを使用せずにboost::shared_ptr返すと、コードがコンパイルされます (これは、C++ の共変の戻り値の型によるものだと理解しています)。問題は、 が から派生していないためであるboost::shared_ptrことがわかります。しかし、他のクラスで使用するために を返したいのですが、そうでない場合は、戻り値を戻り値の後にキャストする必要があります。 Ret1boost::shared_ptrRetInterfaceboost::shared_ptrRet1

  1. 私は何か間違ったことをしていますか?
  2. そうでない場合、言語がこのようなものになっているのはなぜですか。このシナリオでは、スマート ポインター間の変換を処理するために拡張可能である必要があります。望ましい回避策はありますか?
0 投票する
5 に答える
2087 参照

c# - 子クラスの列挙子を親クラスの列挙子にキャストするのは間違っていますか?

ビルドに次のようなエラーがあります。

エラー 12 型 'System.Collections.Generic.IEnumerator< BaseClass>' を 'System.Collections.Generic.IEnumerator< IParentClass>' に暗黙的に変換できません。明示的な変換が存在します (キャストがありませんか?)

単純に捨ててはダメですか?

これは私のコードです:

私の質問は、この行を変更することはできますか?

に:

(悪い副作用なしで)?

受け入れられた回答:
関数を次のように変更しました (Jon Skeet の投稿を読んだ後):

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

c# - C# 4.0 ではジェネリック共分散と反分散はどのように実装されていますか?

私は PDC 2008 には参加しませんでしたが、C# 4.0 がジェネリック共分散と反分散をサポートすると発表されたというニュースを耳にしました。つまり、List<string>に割り当てることができますList<object>。それはどうしてですか?

Jon Skeet の著書C# in Depthでは、C# ジェネリックが共分散と反分散をサポートしない理由が説明されています。主に安全なコードを書くためのものです。現在、C# 4.0 はそれらをサポートするように変更されました。それは混乱をもたらすでしょうか?

C# 4.0 の詳細を知っている人はいますか?