146

最初と2番目の書き込みは機能するが、最後は機能しないのはなぜですか?3つすべてを許可して、それが1、(int)1であるか、または渡されたかを検出する方法はありますか?そして、本当になぜ1つが許可されているのに、最後の1つが許可されているのでしょうか。2番目は許可されていますが、最後は許可されていません。

コンパイルエラーを表示するデモ

using System;
class Program
{
    public static void Write(short v) { }
    static void Main(string[] args)
    {
        Write(1);//ok
        Write((int)1);//ok
        int i=1;
        Write(i);//error!?
    }
}
4

8 に答える 8

186

最初の 2 つは定数式ですが、最後の 1 つはそうではありません。

C# 仕様では、定数に対して int から short への暗黙的な変換が許可されていますが、他の式では許可されていません。定数の場合、コンパイラは値がターゲットの型に適合することを確認できますが、通常の式の場合はできないため、これは合理的な規則です。

このルールは、暗黙的な変換は無損失であるべきであるというガイドラインに沿っています。

6.1.8 暗黙的な定数式の変換

暗黙的な定数式の変換により、次の変換が可能になります。

  • typeの定数式(§7.18) は、定数式の値が変換先の型の範囲内にある場合、intsbytebyteshortushortuint、またはに変換できます。ulong
  • 定数式値が負でなければ、 typeの定数式を typelongに変換できます。ulong

(C# 言語仕様バージョン 3.0 より引用)

于 2012-07-11T12:21:53.787 に答える
67

切り捨ての可能性があるため、からintへの暗黙の変換はありません。shortただし、コンパイラは定数式をターゲット型として扱うことができます。

1?問題ありません。明らかに有効なshort値です。i?それほど多くはありません–short.MaxValueたとえば、ある値>である可能性があり、コンパイラは一般的な場合にそれをチェックできません。

于 2012-07-11T12:20:09.560 に答える
8

int リテラルは暗黙的に に変換できますshort。一方:

ストレージ サイズが大きい非リテラル数値型を暗黙的に short 型に変換することはできませ

したがって、リテラルの暗黙的な変換が許可されているため、最初の 2 つは機能します。

于 2012-07-11T12:22:15.660 に答える
6

最初の2つでリテラル/定数を渡しているためだと思いますが、3番目に整数を渡すときに自動型変換はありません。

編集:誰かが私を打ち負かしました!

于 2012-07-11T12:21:02.370 に答える
4

コンパイラは、コードが失敗する理由を教えてくれました

cannot convert `int' expression to type `short'

だからここにあなたが尋ねるべき質問があります:なぜこの変換は失敗するのですか?私は「c#convert int short」をグーグルで検索し、shortキーワードのMS C#ページに行き着きました。

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

このページにあるように、より大きなデータ型からへの暗黙のキャストは、shortリテラルに対してのみ許可されます。コンパイラは、リテラルが範囲外にあることを認識できますが、それ以外の場合は認識できません。そのため、プログラムロジックの範囲外エラーを回避したことを確認する必要があります。その安心感はキャストによって提供されます。

Write((short)i)
于 2012-07-12T01:35:48.140 に答える
3

Nonliteral型からより大きなサイズの short への暗黙的な変換が行われないためです。

暗黙的な変換は定数式でのみ可能です。

public static void Write(short v) { }

integer値を引数として渡す場合short

int i=1;
Write(i);  //Which is Nonliteral here
于 2012-07-11T12:24:13.637 に答える
0

int-> shortから変換すると、データが切り捨てられる可能性があります。それが理由です。

于 2012-07-17T15:20:15.460 に答える