Nullまたは空の値でvarを初期化できますか?
C#は厳密に/強く型付けされた言語です。 varは anonymous types のコンパイル時型バインディングに導入されましたが、varは設計時に既知のプリミティブ型およびカスタム型に使用できます。実行時にvarのようなものはなく、実際の型に置き換えられます。実際の型は、参照型または値型です。
あなたが言う時、
var x = null;
nullにバインドされた型がないため、コンパイラはこれを解決できません。このようにすることができます。
string y = null;
var x = y;
コンパイル時にxがこの場合文字列である型を知ることができるため、これは機能します。
なぜこれが不可能なのでしょうか?
var theNameOfTheVar = (TheType)null;
例えば:
var name = (string)null;
そのような単純な。
他の人が述べたように、タイプのあいまいさが問題です。そのため、答えは「いいえ」です。C#は厳密に型指定された言語であり、コンパイル時に既知の型のみを処理するため、C#はそのようなことをさせません。コンパイラはobject
型のように推論するように設計できましたが、設計者は余分な複雑さを回避することを選択しました(C#ではnull
には型がありません)。
1つの選択肢は
var foo = new { }; //anonymous type
繰り返しますが、コンパイル時の既知の型に初期化することに注意してください。最後はnull
ではなく、匿名オブジェクトです。 new object()
より数行短いだけです。 この場合は匿名タイプをfoo
にのみ再割り当てできますが、これは望ましい場合と望ましくない場合があります。
タイプが不明なnull
に初期化することは問題外です。
dynamic
を使用している場合を除きます。
dynamic foo = null;
//or
var foo = (dynamic)null; //overkill
もちろん、foo
変数に値を再割り当てしたい場合を除いて、それはまったく役に立ちません。 Visual Studioでもインテリセンスのサポートが失われます。
最後に、他の人が答えたように、キャストによって特定の型を宣言することができます。
var foo = (T)null;
オプションは次のとおりです。
//initializes to non-null; I like it; cant be reassigned a value of any type
var foo = new { };
//initializes to non-null; can be reassigned a value of any type
var foo = new object();
//initializes to null; dangerous and finds least use; can be reassigned a value of any type
dynamic foo = null;
var foo = (dynamic)null;
//initializes to null; more conventional; can be reassigned a value of any type
object foo = null;
//initializes to null; cannot be reassigned a value of any type
var foo = (T)null;
これが値の初期化からvar変数への変換方法です
var _myVal = (dynamic)null;
var
は、静的に入力する必要があるため、null
に設定できません。
var foo = null;
// compiler goes: "Huh, what's that type of foo?"
ただし、この構造を使用して問題を回避できます。
var foo = (string)null;
// compiler goes: "Ah, it's a string. Nice."
確かではありませんが、聞いたことから、dynamic
の代わりにvar
を使用することもできます。これには静的な型指定は必要ありません。
dynamic foo = null;
foo = "hi";
また、var
キーワードまたは変数全般を意味するかどうかという質問から私には明確ではなかったため、(クラスへの)参照とnullable型のみをnullに設定できます。たとえば、これを行うことができます:
string s = null; // reference
SomeClass c = null; // reference
int? i = null; // nullable
ただし、これはできません。
int i = null; // integers cannot contain null
さて、新しいオブジェクトに割り当てることができると思います。何かのようなもの:
var v = new object();
いや。 var
は型に初期化する必要があり、nullにすることはできません。
var
は、コンパイル時に必要な型を推測するようコンパイラーに指示するだけです... null
から推測することはできません(ただし、場合によってはcould)。
だから、これを行うことは許可されていません。
「空の値」と言うとき...
var s = string.Empty;
//
var s = "";
はい、できますが、null
はできません。
nullをvar型に割り当てることはできません。
Nullを割り当てると、コンパイラは必要な変数をvarの場所で見つけることができません。
エラーがスローされます:Cannot assign <null> to an implicitly-typed local variable
これを試すことができます:
var dummy =(string)null;
ここでコンパイラはあなたが望むタイプを見つけることができるので問題ありません
いくつかの空の値を割り当てることができます。
var dummy = string.Empty;
または
var dummy = 0;
varをnullで初期化することはできません。varを型として初期化する必要があります。そうしないと、推論することができません。しようとしています。
ありがとう、Mr.Snake、これは私が探していた別のトリックに役立ちました:)
Null許容型の短縮形の割り当て。このような:
var someDate = !Convert.IsDBNull(dataRow["SomeDate"])
? Convert.ToDateTime(dataRow["SomeDate"])
: (DateTime?) null;