Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何初始化var?_C#_Initialization - Fatal编程技术网

C# 如何初始化var?

C# 如何初始化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

我可以用null或一些空值初始化var吗?

A
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;