2012-03-15 21 views
0

SqlServerのデータ型の1つがsmallintで、.NETのshortまたはInt16に対応しています。私はint型の単純なforループを使っていましたが、それは暗黙のうちに2つの間で変換できないと私に言ったのですか?.Netがshortからintに変換できないのはなぜですか?

なぜこれが可能でないのだろうと思っていましたか?短くするよりも大きな数字を使用しないようにするだけですか?私は約80%の人がintlongに変換する必要がなかったと確信しているので、私には奇妙に思えますか?

サンプル:あなたは狭くする幅の広い、狭いから広いしようとしているので、intshortから

public Int16 Test() 
{ 
    int i = 2; 
    return i; 
} 
+0

が怪しいですね、あなたが問題を示すコードを投稿することができますか? –

+0

'long'はCLR型の' int'よりも大きいので 'int'を' long'に変換する必要はありません。 –

答えて

5

暗黙的に存在している必要がありますので、可能性データ損失を暗黙的にサポートされていません。コンパイラはこれを無視することができますが、を明示的ににキャストして、潜在的な問題を理解していること、そしてそれで問題ないことを示すように要求します。

更新:

あなたのコードが狭まりキャストであると暗黙的に行うことはできません。修正:

public Int16 Test() 
{ 
    int i = 2; 
    return (Int16)i; 
} 

コンパイラは、理論的にはデータの損失は発生しないだろうことを知っている可能性があり、この特定のケースでは、冗談なるように、けれども。それ以外の99.99%ではコンパイル時にこれを知ることができないため、データ損失が発生する可能性のある明示的なキャストだけがサポートされます。

これは、開発者がデータ損失によって実行時エラーが発生した場合、その意思決定を意識して行わなければならず、コンピュータ上で虚言を放棄する法的立場を有していないことを明らかにします。

VB.NETはあなたがstrictオプションを使用していても、この制限を回避することができるように表示されます。

http://msdn.microsoft.com/en-us/library/k1e94s7e(v=vs.80).aspx

だから私は、これはC#の特定の設計上の選択であると推定します。

+1

Adamがここで言ったことをピギーバックするだけで、より大きなコンテナから小さなコンテナへ行くと、データの損失が保証されます。明示的にキャストすると、コンパイラはその事実を認識しており、それを目的に実行していることを伝えます。 –

+0

@DJQuimby Taは、私の答えを少し修正しました。 –

+0

@AdamHouldsworth私はそれを修正する方法を知っています。問題はなぜでしたか – ediblecode

1

Implict変換は、唯一の非狭窄変換(データの損失を防ぐため)に行われます。

+0

私は非狭め変換(short - > int)について話しています –

+0

@JakubKonecki実際には、int - > short – ediblecode

+0

Haについて話しています。質問のみが最初から正しい場合は... ;-) –

0

使用している言語によって異なります。

VBは、Int16をオーバーフローさせない限り、デフォルトで問題なく変換します。あなたがstrictオプションを有効にした場合 あなたは、変換を自分で行う必要があります:C#でConvert.ToInt16(yourInt32)

をあなたはそれをキャストする必要があります。(Int16)yourInt32

関連する問題