C#では、boolをint型にキャストできないことはすべて知っています。私はビットマスクを使って真のバイナリ表現を見たいと思っていましたが、(bool & int)を使用することはできません。問題はアーキテクチャの欲望であると思います。 "真は真であり、数字ではありません!= 0"(C++)このようなアーキテクチャのメリットが何か不思議でした。 C true/falseのコンセプトには何が悪いですか?C#はboolをint型にキャストできません
答えて
true
またはfalse
に整数を使用できない場合は、プログラマには明らかです。
if (5 > 0)
は、それは彼らがswitch文に条件を落下許可しない理由と同じ理由です理解しやすいのではなくif(5)
です。間違いをするのは簡単すぎる。
私は実際にはC#のLOTのswitch文を使って落とす方法を嫌っています。転倒が非常に有益であるケースがたくさんあります。 – Joseph
@Joseph:エラーが起こりにくいケースはまだ許されています。まず作業をしなければ落ちることがあります。しかし、他の "仕事"をした後に事件が起こることは容易に維持できません。 –
@Joseph:有用であるということは、エラーを起こしやすいというわけではなく、間違いを起こしやすいということではありません。 –
情報だけのために、Convert.ToInt32(fooBool)
は(ただし、これはBCLの任意の表現であり、必ずしも1がメモリを使用していました。)true
が1で表されることを教えてくれ、と0によってfalse
すべき
ここでのポイントは、ビット表現は実際にはどのプログラマにとっても無意味であるべきだということです。ブール値は特定の目的(フラグなど)で使用するためのものであり、intと混同しないようにしてください。そうしないと、変数の使用がかなり混乱する可能性があります。
ナンバー!= 0、あまりにもエラーが発生しやすいです。
C#このような一般的な間違いを覆すために多くの設計上の決定を下しました。
誰もが他の事業体の意思決定のすべてを好きではない...ちょうどC整数では、独自のコンバータ(quick- & -dirtyのような)
を書き、頻繁に二重に通常の数と真偽値として使用されている、など特定の数がゼロでない間に実行されるforループ。
const char *s;
for (s = str; *s; ++s)
;
return (s - str);
が、そのスニペットの短い、それをマスク真の目的しばらく、私が探していた文字がある一方で、本質的に」ループを言う:それは明らかに、ナイーブはstrlenルーチンのような簡潔なコードのためにそのメリットを持って使用ですヌル文字ではありません "。しかし、書き留めておけば、「それが気に入ったらブール値として扱い、他の場合は数値として扱う」と書かれています。
ダブル自然のこの種のは、伝えられるところで頻繁に問題が生じると(あなたがint
の特定の使用がint
かbool
として意図されているかどうかを文脈から判断する必要があるため)、それはコードが読みにくくなります。あなたは絶対に整数としてブール値を使用する必要がある場合
あなたはNoldorin mentionedとして
Convert.ToInt32(someBool)
使用するか、明確にあなたが使用していると言うどちらも
someBool ? 1 : 0
を使用して独自のロールバックすることができますいずれかint
(bool
ではなく)。
弱く型付けされた言語ではなく、強く型付けされた言語をC#にするという決定に関しては、真実/偽または1/0に関する多くの問題はないと思います。強く型付けされた言語には、多くの利点(およびいくつかの欠点)があります。利点の1つは、式の誤用(または誤った使用)によるバグを減らすことです。
例えば、
int i = 0;
if (i = 1) {
...
}
も、C#でコンパイルされませんが、それはC#、強く型付けされた言語は、これらの利点を推測するために選択C.
で正しくコンパイルおよび実行されます両方C#プログラマーたとえそうであっても、彼らは選択すればboolからint(そしてback)への変換を導入することができました。上記のようなバグの可能性があるため、そうしなかったのではないかと推測します。
これは「強力なタイプ」とは関係ありません。 たとえば、Pythonは強く型付けされており、代入はステートメントですが、代入演算子は値を返します(つまり、a = b = c = 5を実行する場合に便利です)ので、if(i = 1)何も返さない。だから "if a = 3:if"のようなことをするのは誤りです。 しかし、python自体には "何でもブールの解釈があります"というルールがあります。空のコレクションは0、空の文字列はFalse、その他のものはTrueですので、実行できます mylist = [] mylistの場合: 何か – ZeD
はい、このコンテキストで割り当ての結果を使用できる理由は、弱く型付けされているためです。ほとんど確かにその意図はi == 1です。これはブール結果であり、C#ではそのコンテキストで許可されます。 Cが強く型付けされている場合、C#のように、このコンテキストでは代入の結果は許可されません。そのままでは、割り当ての結果は(誤って、この場合)ブール値として自然に評価され、バグが生まれます。 – tvanfosson
あなたはこれらについて良い点を挙げています。ただし、1つのショートカットは削除されます。
cでは、 "bBool = 1 - bBool"というコードで簡単に切り替えることができます。
bBoolがtrue(1)の場合、1 - 1 = 0です.bBoolはfalseに変わります。
bBoolがfalse(0)の場合、1 - 0 = 1です。bBoolがtrueに変わります。
代わりにC#で条件を調べて状態を確認し、それを逆にする必要があります。これはマシンと私にとってより多くの作業を引き起こします。
何か不足していますか? 'bBool =!bBool;'あなたは何を説明しますか? – MarqueIV
我々はConvert.ToInt32を使用することができ、その定義はここにある:
public static int ToInt32(bool value);
- 1. 演算子 '&&'は 'bool'型と 'int'型のオペランドには適用できません
- 2. キャスト<int>のC#でのメソッドは型キャストではありません
- 3. オブジェクトをint型配列にキャストできません
- 4. 'Common.Date'型のオブジェクトを型 'System.IConvertible'にキャストできませんC#
- 5. なぜ私は "オペレーター" || '型 'bool'と 'int' "のオペランドに適用できません"エラー?
- 6. static_castはintをcharにキャストできますが、reinterpret_castはキャストできません。
- 7. エラーは、引数に '* int型' から 'int型**' を変換できません '1' 'int型のショー(int型*)' に
- 8. [Cは[Ljava.lang.Object;にキャストできません。
- 9. CS0030: 'int'を 'bool'に変換できません
- 10. は、型文字列をBoolに変換できません。
- 11. は型をboolに変換できません
- 12. C#引数1: 'bool'から 'bool'に変換できません
- 13. C#:暗黙的に型 'int'を 'int []'に変換できません
- 14. String型からjava型にfloat型にキャストできません。
- 15. SQLクエリをLINQに変換する - 演算子 '&&'を 'int'型と 'bool'型のオペランドに適用できません
- 16. int型をboolに暗黙的に変換できません.boolを使用してディスパッチし、演算子 - 適用できません。
- 17. 演算子 "&&"は、 'int'型と 'int'型のオペランドには適用できません
- 18. 型System.Collections.Generic.Icollectionを変換できません<int>をintに
- 19. 暗黙的に型 'bool?'を変換できません。 to 'bool' Checkbox MVC
- 20. 'Microsoft.SqlServer.Dts.Pipeline.BlobColumn'型のオブジェクトを型 'System.Byte []'にキャストできません
- 21. 'System.Collections.ArrayList'型のオブジェクトを型 'System.Collections.Generic.IEnumerable'にキャストできません
- 22. ContentPage型のオブジェクトをContentPage型にキャストできません
- 23. MyObject型のオブジェクトをMyObject型にキャストできません
- 24. 'System.Web.UI.WebControls.CommandEventArgs'型のオブジェクトをキャストできません 'System.Web.UI.WebControls.DataListCommandEventArgs'の型に
- 25. 'System.String'型に 'System.DBNull'型のオブジェクトをキャストできません。エラー
- 26. 'System.DateTime'型を 'System.Object'型にキャストできません。 LINQ
- 27. 'System.Int32'型のオブジェクトを 'System.String'型にキャストできませんエラー
- 28. 暗黙的に型 'int?'を変換できません。 to int '
- 29. オペランド '=='は、bool型と文字列型のオペランドには適用できません。
- 30. 演算子&&はdouble型とbool型のオペランドには適用できません
([ "?タイトルに『タグ』の質問には、すべき"]を参照してくださいhttp://meta.stackexchange.com/questions/19190/should-questions-should-its-titles-that-their-titles)、コンセンサスは「いいえ、彼らはすべきではありません」です! –