問題タブ [object-initializers]
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# 4.0 コンパイラのバグですか?
このコードは正常にコンパイルされますが、コンパイルに失敗するはずです。また、実行するとNullReferenceException
. Bar
欠落しているコードは、プロパティの初期化における「新しいバー」です。
これは既知のバグですか?
c# - オブジェクト初期化子でのイベントの割り当て
C# のオブジェクト初期化子でプロパティと共にイベントを割り当てることができないのはなぜですか? そうすることがとても自然に思えます。
それとも、私が知らないトリックがありますか?
c# - 「フィールド初期化子は非静的フィールド、メソッド、またはプロパティを参照できません」CS0236 エラーの概念的な理由
C#では、インスタンス フィールド初期化子が別のフィールドを参照することはできません。たとえば、このコードは無効です:
「s2」は「s1」を参照しているためです。
しかし、なぜこれが許可されていないのでしょうか?
私の最初の考えは、C#の仕様は初期化順序を保証していないということでしたが、仕様によれば、順序は宣言の順序です。
変数初期化子は、クラス宣言に現れるテキストの順序で実行されます。
順序が決定論的である場合、この種のコードの落とし穴は何でしょうか?
よろしくお願いします。
編集 :
Hps、0xA3、およびPeterの回答によると:
継承シナリオでの初期化の順序は非常に混乱する可能性があります。
そのような機能を実装するには、コンパイラ開発チームからのリソースが必要になりますが、メリットはほとんどありません。
論理的な理由でメソッドやプロパティを使用することはできません ( Peterに感謝します)。したがって、一貫性を保つために、フィールドについても同じことが当てはまります。
c# - 拡張可能な API を作成し、オブジェクト初期化構文を使用するにはどうすればよいですか?
Mercurial のコマンド ライン クライアントをラップするクラス ライブラリがあります。
私の意図は、すべての組み込みコマンドのサポートを実装することですが、それらに加えて、そこにはたくさんの拡張機能があります.
したがって、他の人も私も拡張機能のサポートを追加できるという意味で、ライブラリを拡張可能にする必要があります。より一般的で典型的な拡張機能 (少なくとも Mercurial にバンドルされている拡張機能のかなりの数) のサポートを追加する予定ですが、それでも外部から拡張できるようにしたいと考えています。
現時点では、コマンドの構文は次のようになります。
ただし、これは、プログラマーが拡張機能が単に追加された部分であると感じない限り、拡張機能にはあまり適していません。
たとえば、手動でこれを行うことができるように、追加のコマンド ライン引数のパブリック コレクションを公開するとします。
オブジェクト初期化子の一部として設定できるように追加の拡張機能を追加する簡単な方法はないようです。
私は流暢なインターフェイス構文に追加するか、おそらく切り替えることを考えていました。この場合、次のように書くことができます。
しかし、人々は流暢なインターフェースが好きではなく、おしゃべりになりすぎると感じています。
他にどのようなオプションがありますか?
私が欲しいもの、基本的に:
- 1 つの一般的な構文スタイル
- 組み込みのものの両方について
- 私のライブラリのユーザーによって追加された拡張機能と同様に
私のライブラリのユーザーは、新しいクラスと拡張メソッドを追加して Intellisense サポートを取得することでライブラリを拡張すると思いますが、オブジェクト初期化子で拡張メソッドを使用することはできません。それは私が望むものではありません。
どんなアイデアでも大歓迎です。
c# - 共変オブジェクト初期化子?
Dictionary<string,bool> であるプロパティを持つクラスがあるとします。オブジェクト初期化子を使用して、この構文を使用できます (かなりきれいに見えると思います)。
ただし、イニシャライザの外では、これを行うことはできません:
なぜイニシャライザは特殊なケースなのですか? LINQの要件、共分散などと関係があると推測するのは危険ですが、そのような初期化子をどこでも使用できないのは少し違和感があります...
c# - 動的配列| ExpandoObject | 圧縮された初期化構文
私はC#でDynamicObjectを使用しようとしていますが、動的な配列が必要でした。
これは正常に動作します。
編集:以下のExpandoObjectを参照してください。
しかし、私はまた、この圧縮された初期化の新しい構文を使用して、その配列にいくつかのデータを入力するのが好きです。
しかし、その場合、すべてのオブジェクトは非動的タイプの「オブジェクト」を取得し、アイテムをループすると例外が発生します。
エラー:「オブジェクト」に「名前」の定義が含まれていません。配列項目を間違った方法で初期化しただけだと思います。代わりに動的オブジェクトを追加するにはどうすればよいですか?
編集:新しいコンテンツ:
「動的」には、プロパティを動的に追加する機能がないことに気付きました。
内部ディクショナリ内のすべてのアイテムをプロパティとして公開するExpandoObjectを使用することをお勧めします。しかし残念ながら、ExpandoObjectはこの優れた圧縮作成構文をサポートしていないようであり、コンパイラーは次のように文句を言います。
したがって、答えは次のようになります。それは不可能です。
c# - オブジェクト初期化子と LINQ を使用した Ninject
私はNinjectを初めて使用するので、私がしようとしていることは不可能かもしれませんが、尋ねたかった. 以下フリーハンドなので誤字脱字があるかもしれません。私がインターフェースを持っているとしましょう:
そして具体的な:
私が慣れ親しんでいるのは、配列または xml からデータを取得するときの次のようなものです。
このようにコンクリートをインターフェースに密結合させたくありません。LINQ to Objects またはオブジェクト初期化子で Ninject を使用することに関する情報を見つけることができませんでした。私は間違った場所を探しているかもしれませんが、まったく運がない日を探しています。
カーネルをシングルトン インスタンスに入れ、それが機能するかどうかを確認することを考えていましたが、うまくいくかどうかはわかりません。また、カーネルを渡すのは悪いことだと聞いています。現在、これをクラス ライブラリに実装しようとしています。これが不可能な場合、この場合のベストプラクティスについて、誰かが例や提案を持っていますか? 助けてくれてありがとう。
編集: いくつかの回答に基づいて、明確にする必要があると感じています。はい、上記の例は短命に見えますが、それは単に私がやろうとしていた 1 つの作品の例にすぎません。より大きな図を見てみましょう。XML の代わりに、サードパーティの Web サービスを介してすべてのデータを収集し、そのためのインターフェイスを作成しているとします。データは、wsdl で定義されたオブジェクトである場合もあれば、xml 文字列である場合もあります。IPerson は、Person オブジェクトと User オブジェクトの両方に使用できます。移植可能である必要があり、他のプロジェクトで使用され、MVC3 Web アプリケーションに渡され、オブジェクトが JavaScript でも使用されるため、別のクラス ライブラリ内でこれを行います。これまでのすべての入力に感謝します。
c# - オブジェクト初期化コードをデバッグするには?
Visual Studio でオブジェクト初期化子コードを段階的にデバッグする方法はありますか?
例:
この種のコードでエラーが発生することがあります (たとえば、int への変換が失敗した場合)。VS はそれをステップ実行できないようです。行全体でエラーがスローされるだけで、どの初期化が失敗したかを試す必要があります。 .
これをデバッグする簡単な方法はありますか、それとも大規模または複雑な初期化のためにオブジェクト初期化子を避ける方が良いですか?
VS 2010 と C# 4.0 を使用しています。
linq-to-sql - パラメータ化されたコンストラクターを使用するときに、linq to sql で型をマップするにはどうすればよいですか?
L2S は、オブジェクト初期化構文なしでカスタム/POCO 型を L2S エンティティ型にマップするように設計されていない ことを知っています。しかし、パラメーター化されたコンストラクターを使用して POCO に投影し、その結果に式を適用しようとしたときに刺されないように、これを達成するバックブックの方法はありますか?
c# - イニシャライザがスローした場合、オブジェクトは構築されますか?
Jag Reeghal のブログでこの記事を読んでいましたが、彼が提案していることは、オブジェクト初期化子を使用することと実際には同じではないように思えました。それから、私は本当によくわからないことに気づきました。
オブジェクト初期化子を使用してオブジェクトが構築され、それらの初期化子の 1 つがスローされると (おそらく Null 参照例外)、オブジェクトは実際に構築されますか? これは基本的に、コンストラクターでスローされる例外のようなものですか? それとも、オブジェクトは完全に構築されてから初期化されていますか?