型「string」を変換することはできません「int型?」基準変換、ボクシング変換、アンボクシング変換、ラッピング変換はnull型変換を介して

StackOverflow https://stackoverflow.com/questions/887943

  •  23-08-2019
  •  | 
  •  

質問

C#は、以下の受け入れます:

object o = "hello";
int? i = o as int?;

if (i == null) {
    // o was not a boxed int
}
else {
    // Can use i.Value to recover the original boxed value
}

ではなく、

String o = "hello";
int? i = o as int?;

if (i == null) {
    // o was not a boxed int
}
else {
    // Can use i.Value to recover the original boxed value
}

私はC#でキーワードasの行動に疑問を抱いています。

Javaのと同じで、これは失敗します:

Object test1 = "hello";
Integer test2 = (Integer) test1;
String test3 = "hello";
Integer test4 = (Integer) test3; //compilation error
役に立ちましたか?

解決

コンパイラは、それはあなたのことを告げるように文字列がint?になることはありませんことを知っています。それはint?が有用ではないことを意味するものではありません。あなたの未遂ユースケースは通常のものから遠く離れています。通常の1は「私は、整数値が/不明不足している可能性を表現したい」です。そのため、int?は非常にうまく機能します。

なぜあなたはのでしょう。の元のコードが動作することを期待?なぜそれが参考になる?

は、のことに注意してくださいがボックス化解除のために、NULL可能タイプでasを使用することができます:

object o = "hello";
int? i = o as int?;

if (i == null)
{
    // o was not a boxed int
}
else
{
    // Can use i.Value to recover the original boxed value
}

EDIT:あなたは物事を解析するasを使用していない、あなたのコメントを見ました。

:あなたはおそらく int.TryParse を使用したいです
string text = "123":
int value;
if (int.TryParse(text, out value))
{
    Console.WriteLine("Parsed successfully: {0}", value);
}
else
{
    Console.WriteLine("Unable to parse text as an integer");
}
あなたは(すなわち、それはそれ以外のバグだ)文字列が整数であることを意味していることを確認している場合は、

次に、あなただけの<のhref = "http://msdn.microsoft.com/en-us/library/systemを使用することができます.int32.parse.aspx」のrel = "noreferrer"> int.Parseするます:

int value = int.Parse(text);

それ構文解析が失敗した場合に例外をスローします。

注また、これらの方法の両方は、あなたは番号が(例えば、数千区切り)その形式で表現する方法を表現することを可能にするフォーマット・プロバイダ(通常培養情報)を指定することを可能にすること。

EDIT: - 変換はこれまで決して成功しないだろう、それは文字列を知っているので、あなたの新しい質問への答えでは、コンパイラはこれを防ぐには、の可能性は箱入りint型にすることはできません。それだけで元の値がオブジェクトであることを知っている場合は、そのは成功するかもしれません。

たとえば、私があなたに言ったとし、「ここ形状です:それは正方形で?」それは賢明な質問です。それはそれを尋ねるために合理的です:あなたは形状を見ずに言うことはできません。

、しかし、私が言った場合:「ここに三角形だ:それは正方形で?」そして、あなたは合理的三角形はおそらく平方することはできませんと、私の顔で笑うために資格を与えているはずだ - 。質問は意味がありません。

他のヒント

int型? null許容整数型ではなく、変数の任意の他のタイプを含むことができるINTを意味する。

あなたはintまたは文字列が含まれている可能性があり、変数の型をしたい場合は、

、オブジェクト、または私が思うの文字列を使用して、型キャストでいっぱいの人生を生きるために必要があるだろう。あなたがが、それをしたいと思う理由を私は知りません。

int型?あなたは、任意の整数値、またはnull値を格納することができます。質問への答えは、「配置この人はどのように多くの受注た」私はこの人が決して持っていないという事実を知っている」と思われる代わりに、注文数の「私は知らない」、またはゼロ合法的であると言うときには便利です「注文しています。

私はさらにいくつかの情報を追加したい。

を可能System.String の密封されたとしてマークされている他の場合、キャストが無効であるとコンパイラがコンパイルでエラーがスローされますなぜ、。だから、コンパイラがどの種類の可能System.String のinheritesから知っている、あなたは、の演算子はとしてのを使用して文字列をキャストすることができますするためにどの種類。

によりキーワードにの密封され、コンパイラはまた、あなたがをすることを知っていないの機能を追加したり、いくつかの追加のインタフェースを実装するための可能System.String を継承することができますます。

以下のコードは一例であり、コンパイラは、コンパイルで次のエラーがスローされます。

  

に型「SealedClass」を変換できません。   参照を介し「ICastToInterface」   変換、ボクシング変換、   アンボクシング変換、ラッピング   変換、またはnull型変換

public class UnsealedClass {
  // some code
}

public sealed class SealedClass {
  // some code
}

public interface ICastToInterface {
  // some code
}

public class Test {

  public Test() {
    UnsealedClass unsealedClass = new UnsealedClass();

    SealedClass sealedClass = new SealedClass();

    ICastToInterface unsealedCast = unsealedClass as ICastToInterface;  // This works fine

    ICastToInterface sealedCast = sealedClass as ICastToInterface; // This won´t compile, cause SealedClass is sealed
  }
}

しかし、あなたがnullの値をチェックし、nullに設定することができます。

int? blah;
if (blah == null)
{}

int型? NULL可能整数である、それは鋳造などのキーワードとは何の関係もありません。 「文字列」は、INT(NULL可能または非NULL可能)に変換されていない、文字列型オブジェクトです。

キーワードとして、事実上のエラーを返しません、それ以外は、ブラケットを使用して鋳造として、それがnullにオブジェクトを設定するのと同じです。

int i = 1;

object o = i; //boxing

int j = (int)o; //unboxing

この最初の例では、Oに割り当てられたオブジェクトがintであるとして働きます。

今検討します:

string i = "MyString";

object o = MyString;

 int j = (int)o //unboxing raises exception

 int j = o as int; //raises compilation Error as int is not nullable
 int? j = o as int?; /// o == null

私は二つの概念の違いを説明するのに役立つことを願っています。

リチャード

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top