我可以用null或一些空值初始化var吗?
答案 0 :(得分:50)
C#是严格/强类型语言。 var是为anonymous types的编译时类型绑定引入的,但您可以将var用于在设计时已知的原始类型和自定义类型。在运行时,没有像var这样的东西,它被实际类型替换为参考类型或值类型。
当你说,
var x = null;
编译器无法解析此问题,因为没有绑定到null的类型。你可以这样做。
string y = null;
var x = y;
这样可行,因为现在x可以在编译时知道它的类型,在这种情况下是字符串。
答案 1 :(得分:30)
为什么这不可能?
var theNameOfTheVar = (TheType)null;
例如:
var name = (string)null;
这很简单。
答案 2 :(得分:30)
嗯,正如其他人所说的,类型的模糊性是个问题。所以答案是否定的,C#不会让它发生,因为它是一种强类型语言,它只处理编译时已知的类型。编译器可能被设计为推断类型为object
的类型,但设计者选择避免额外的复杂性(在C#null
中没有类型)。
另一种选择是
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;
答案 3 :(得分:16)
这是如何初始化值到 var变量
的方法var _myVal = (dynamic)null;
答案 4 :(得分:6)
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
关键字或变量:只能将引用(对类)和可空类型设置为null。例如,您可以这样做:
string s = null; // reference
SomeClass c = null; // reference
int? i = null; // nullable
但你不能这样做:
int i = null; // integers cannot contain null
答案 5 :(得分:4)
嗯,我认为你可以将它分配给一个新对象。类似的东西:
var v = new object();
答案 6 :(得分:3)
不。 var
需要初始化为一个类型,它不能为空。
答案 7 :(得分:3)
var
只是告诉编译器在编译时推断出你想要的类型......它无法从null
推断出来(尽管有些情况下可以)。< / p>
所以,不允许你这样做。
当你说“一些空值”时......如果你的意思是:
var s = string.Empty;
//
var s = "";
然后是的,你可以这样做,但不是null
。
答案 8 :(得分:2)
您无法为var类型指定null。
如果指定null,则编译器无法在var位置找到您想要的变量。
抛出错误:Cannot assign <null> to an implicitly-typed local variable
你可以试试这个:
var dummy =(string)null;
这里编译器可以找到你想要的类型,所以没问题
您可以指定一些空值。
var dummy = string.Empty;
或
var dummy = 0;
答案 9 :(得分:0)
你不能用null初始化var,var需要初始化为一个类型,否则无法推断出来,如果你认为你需要这样做,也许你可以发布代码,很可能还有另一种方法可以做你在尝试什么。
答案 10 :(得分:0)
谢谢Mr.Snake,发现这对我正在寻找的另一个技巧很有帮助:)(没有足够的回复评论)
可空类型的简写分配。 像这样:
var someDate = !Convert.IsDBNull(dataRow["SomeDate"])
? Convert.ToDateTime(dataRow["SomeDate"])
: (DateTime?) null;