web-dev-qa-db-ja.com

varを初期化する方法は?

Nullまたは空の値でvarを初期化できますか?

53
maztt

C#は厳密に/強く型付けされた言語です。 varは anonymous types のコンパイル時型バインディングに導入されましたが、varは設計時に既知のプリミティブ型およびカスタム型に使用できます。実行時にvarのようなものはなく、実際の型に置き換えられます。実際の型は、参照型または値型です。

あなたが言う時、

var x = null; 

nullにバインドされた型がないため、コンパイラはこれを解決できません。このようにすることができます。

string y = null;
var x = y;

コンパイル時にxがこの場合文字列である型を知ることができるため、これは機能します。

50

なぜこれが不可能なのでしょうか?

var theNameOfTheVar = (TheType)null;

例えば:

var name = (string)null;

そのような単純な。

30
Snake

他の人が述べたように、タイプのあいまいさが問題です。そのため、答えは「いいえ」です。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;
30
nawfal

これが値の初期化からvar変数への変換方法です

var _myVal = (dynamic)null; 
18
Anjan Kant

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
7
mafu

さて、新しいオブジェクトに割り当てることができると思います。何かのようなもの:

var v = new object();
4
Hassanation

いや。 varは型に初期化する必要があり、nullにすることはできません。

3
Jason Evans

varは、コンパイル時に必要な型を推測するようコンパイラーに指示するだけです... nullから推測することはできません(ただし、場合によってはcould)。

だから、これを行うことは許可されていません。

「空の値」と言うとき...

var s = string.Empty;
//
var s = "";

はい、できますが、nullはできません。

3
Nick Craver

nullをvar型に割り当てることはできません。

Nullを割り当てると、コンパイラは必要な変数をvarの場所で見つけることができません。

エラーがスローされます:Cannot assign <null> to an implicitly-typed local variable

これを試すことができます:

var dummy =(string)null;

ここでコンパイラはあなたが望むタイプを見つけることができるので問題ありません

いくつかの空の値を割り当てることができます。

var dummy = string.Empty;

または

var dummy = 0;
2
anishMarokey

varをnullで初期化することはできません。varを型として初期化する必要があります。そうしないと、推論することができません。しようとしています。

0
Pharabus

ありがとう、Mr.Snake、これは私が探していた別のトリックに役立ちました:)

Null許容型の短縮形の割り当て。このような:

var someDate = !Convert.IsDBNull(dataRow["SomeDate"])
                    ? Convert.ToDateTime(dataRow["SomeDate"])
                    : (DateTime?) null;
0
Samynix