更新日:この質問はthe subject of my blog in July of 2013でした。素晴らしい質問をありがとう!
なぜこの割り当ては変数割り当てと同じエラーを作成しませんか?
「なぜ」という質問は、あなたが求めている「本当の」質問が分からないために答えにくいです。その質問に答える代わりに、私はいくつかの異なる質問に答えます。
この仕様のどの部分がこの動作を正当化していますか?
マイケル・リューの答えが正確に指摘しているように、それはセクション8.8.4です。
明示変換の全体のポイントは、変換コードで明示なければならないことです。それで私たちはキャスト演算子を持っています。それは "ここに明示的な変換がある"という大きな旗を振っています。これは明示的な変換がコード内に存在しないC#では数回のうちの1つです。デザインチームが目に見えない形で「明示的」な変換を挿入する要因は何でしたか?
foreach
ループはジェネリックの前に設計されました。
あなたが言っているしたくない
ArrayList myList = new ArrayList();
myList.Add("abc");
myList.Add("def");
myList.Add("ghi");
:あなたはほとんど常にあなたが先リストにあるどのような種類の時間の知っているに持っているジェネリック医薬品のない世界で
foreach(object item in myList)
{
string current = (string)item;
、およびその知識がある。しかし、この情報は型システムでは捕捉されません。そのため、あなたは何とかコンパイラに指示する必要があり、あなたは
foreach(string item in myList)
を言うことによってこのリストはちょうどキャストのように、文字列の完全であるコンパイラへのあなたの主張は、特定の項目があるという主張がされていることをやります文字列。
ジェネリックの世界では、これが間違っているということは間違いありません。それを今すぐ変えることになるので、私たちはそれに固執しています。
この機能はかなり混乱しています。それは本当にそれぞれのため」であるとき、「次の操作を行い、このリスト内の文字列型の各オブジェクトについて」、である
while(enumerator.MoveNext())
{
if (!(enumerator.Current is string) continue;
string item = (string)enumerator.Current;
:私は最初のプログラミングのC#を始めたとき、私はそれが何かの意味を持っていたと仮定しましたこのリスト内のオブジェクトは、その項目が文字列であると主張し、次のことを行います... "(もし前者が実際に望むものであれば、OfType<T>()
拡張メソッドを使用してください)。
言語の終わりバージョン2のタイプシステムを大規模に変更すると、奇妙な "従来の"機能が使用されます。
ジェネリックが使用されている現代のコードでは、コンパイラはこのケースについて警告を出すべきですか?
私はそれを考慮しました。我々の研究は、
foreach(Giraffe in listOfMammals)
がとても共通であることが示されたこと、我々は正しいコードに対して警告を与えることだろうほとんどの時間を。それは "エラーとしての警告"をオンにしてコンパイルするすべての人に問題を引き起こします。そして、一般的にコードに警告を付けるのは悪いと言われますが、は実際にはです。私たちは警告を守らないことに決めました。
C#コンパイラが明示的に変換を不可視に挿入する状況はありますか?
はい。実際に誰かがこの1の後にそのわずか数時間について質問を:
Compiler replaces explicit cast to my own type with explicit cast to .NET type?
明示的な変換が同様に挿入されているいくつかの非常にあいまいな相互運用シナリオがあります。
私は、コンパイラがイテレータコードを生成するときに明示的なキャストとして 'int'の指定を扱うと信じています。 'foreach(grid.Rows内のDataGridViewRow行)が'オブジェクト 'の型を生成するときに' foreach(var row in grid.Rows) 'が' DataGridView'行コレクションで同じことを時折経験します。 –
[キャストと型変換](http://msdn.microsoft.com/en-us/library/ms173105.aspx)、['.NET Frameworkでの型変換](http://msdn.microsoft .com/en-us/library/98bbex99.aspx) –
私は 'foreach int'を実行しているのでエラーを作成しないと思います。' long'は整数型です。 – MyCodeSucks