C# 如何初始化var?
我可以用null或一些空值初始化var吗?AC# 如何初始化var?,c#,initialization,C#,Initialization,我可以用null或一些空值初始化var吗?Avar不能设置为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 f
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
没有
var
需要初始化为一个类型,它不能为null。var
只是告诉编译器在编译时推断您想要的类型……它不能从null
中推断(尽管在某些情况下它可以)
所以,不,你是不允许这样做的
当你说“一些空值”…如果你的意思是:
var s = string.Empty;
//
var s = "";
那么是的,您可以这样做,但不能将null赋值给var类型 如果赋值null,编译器将无法在var中找到所需的变量 抛出错误:
无法分配给隐式类型的局部变量
您可以尝试以下方法:
var dummy =(string)null;
在这里,编译器可以找到您想要的类型,所以没有问题
可以指定一些空值
var dummy = string.Empty;
或
为什么这不可能呢
var theNameOfTheVar = (TheType)null;
例如:
就这么简单。你不能用null初始化var,var需要初始化为一个类型,否则无法推断,如果你认为你需要这样做,也许你可以发布代码,很可能有另一种方法来做你正在尝试的事情 C#是一种严格/强类型语言。var是为的编译时类型绑定引入的,但您可以将var用于在设计时已知的基本类型和自定义类型。在运行时,没有什么比var更好的了,它被一个实际的类型所取代,该类型可以是引用类型,也可以是值类型 当你说
var x = null;
编译器无法解决此问题,因为没有绑定到null的类型。你可以这样做
string y = null;
var x = y;
这将起作用,因为现在x可以在编译时知道它的类型,在本例中是string。好吧,我想您可以将它分配给一个新对象。比如:
var v = new object();
正如其他人所说,类型上的歧义是问题所在。所以答案是否定的,C#不会让这种情况发生,因为它是一种强类型语言,并且只处理编译时已知的类型。编译器本可以设计为将其推断为
对象
类型,但设计者选择避免额外的复杂性(在C#null中
没有类型)
另一种选择是
var foo = new { }; //anonymous type
再次注意,您正在初始化为编译时已知的类型,最后不是null
,而是匿名对象。它只比newobject()
短几行在这种情况下,您只能将匿名类型重新分配给foo
,这可能是可取的,也可能不是可取的
初始化为null
,类型未知是不可能的
除非您使用的是dynamic
dynamic foo = null;
//or
var foo = (dynamic)null; //overkill
当然,它是非常无用的,除非您想将值重新分配给foo
变量。在VisualStudio中也会失去intellisense支持
最后,正如其他人所回答的,您可以通过强制转换声明特定类型
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 someDate = !Convert.IsDBNull(dataRow["SomeDate"])
? Convert.ToDateTime(dataRow["SomeDate"])
: (DateTime?) null;
这是如何将值初始化为var变量的方法
var _myVal = (dynamic)null;
叮!Var有点像对编译器说“我不想声明这个,但你会知道的”。。。说var whather=null就像做一个headfake。你是指C#keyword
var
还是指一般的变量?我希望变量在初始化后执行linq查询为什么不在使用它时初始化它?否var初始化在if语句之上,它将根据条件执行查询并使用相同变量分配(动态)null;这当然是一个有效的解决方案,但我真的找不出任何理由来使用它。没有任何理由。我只是回答TS的问题:)它不是直接对var非常有用,而是对匿名类型的属性非常有用,比如var anonType=new{Example=(TheType)null}@Fredrik Mörk在我的例子中,这有助于我进行单元测试——如果您期望null:var expected=(string)null;好的选项列表+1为什么dynamic foo=null代码>危险?@christian,我不记得当时的想法,但在绝大多数情况下,object foo=null
可以。如果您真的试图初始化一个动态变量,那么很好,只会失去编译时的安全性;工作完美。
var someDate = !Convert.IsDBNull(dataRow["SomeDate"])
? Convert.ToDateTime(dataRow["SomeDate"])
: (DateTime?) null;
var _myVal = (dynamic)null;