c#中使用隐式类型的可空变量?
是否仍然需要将var设置为可为null的类型 这隐式地将i类型化为int,但是如果我想要一个可为null的int呢c#中使用隐式类型的可空变量?,c#,.net-3.5,nullable,var,C#,.net 3.5,Nullable,Var,是否仍然需要将var设置为可为null的类型 这隐式地将i类型化为int,但是如果我想要一个可为null的int呢 var i=0 为何不支持这一点: var?i=0为什么支持它?如果这就是你的意思,你应该说vari=(int?)0取而代之 (好吧,您可能应该只说int?i=0,但对于更复杂的类型,等等)。var是通过赋值右侧的表达式或常量隐式键入的变量本身不是一种类型,因此可为空是不可能的。该问题涉及可为空的类型 例如,您不能创建一个可为null的字符串,这反过来又会阻止您创建一个可为null
var i=0代码>
为何不支持这一点:
var?i=0代码>为什么支持它?如果这就是你的意思,你应该说vari=(int?)0代码>取而代之
(好吧,您可能应该只说int?i=0
,但对于更复杂的类型,等等)。var
是通过赋值右侧的表达式或常量隐式键入的<代码>变量本身不是一种类型,因此可为空
是不可能的。该问题涉及可为空的类型
例如,您不能创建一个可为null的字符串,这反过来又会阻止您创建一个可为null的var,因为var可以是一个字符串。我的答案大致是这样的。“var”是隐式类型的。它通过赋值右侧提供的值计算出它是什么类型。如果你告诉它可以为空,它就不知道应该是什么类型。记住,一旦它被分配,它将永远是这样的类型。试试这个-这就是你所说的吗
static void Main(string[] args)
{
for (int i=0; i < 10; i++)
{
var j = testMethod();
if (j == null)
{
System.Diagnostics.Debug.WriteLine("j is null");
}
else
{
System.Diagnostics.Debug.WriteLine(j.GetType().ToString());
}
}
}
static int? testMethod()
{
int rem;
Math.DivRem(Convert.ToInt32(DateTime.Now.Millisecond), 2, out rem);
if (rem > 0)
{
return rem;
}
else
{
return null;
}
}
static void Main(字符串[]args)
{
对于(int i=0;i<10;i++)
{
var j=testMethod();
如果(j==null)
{
System.Diagnostics.Debug.WriteLine(“j为空”);
}
其他的
{
System.Diagnostics.Debug.WriteLine(j.GetType().ToString());
}
}
}
静态整数?testMethod()
{
内部rem;
Math.DivRem(将.ToInt32(DateTime.Now.毫秒)转换为2,out rem);
如果(rem>0)
{
返回rem;
}
其他的
{
返回null;
}
}
VAR是编译器在编译时确定的隐式类型。它是在第一次使用时分配的。也就是说,当你设置var I=1时,var是一个int,因为这就是数字1。如果改为使用var I=SomeFunction(),其中某个函数返回可为null的int,则I将设置为int?。现在,如果您想要控制变量类型,那么就不应该使用上述var
所以,根据您的示例,底线是使用var是错误的,应该显式地设置为int?从一开始
- 达罗
在这种情况下,我甚至不会使用var。如果是复杂类型或简单类型,比如int,我会使用类型“object”
例如:
//Define all global class variables
List<int> m_lInts = New List<int>();
List<string> m_lStrs = New List<string>();
public static object FindMyObject(string sSearchCritera)
{
//Initialize the variable
object result = null;
if (result == null)
{
//Search the ints list
foreach(int i in m_lInts)
{
if (i.ToString() == sSearchCritera)
{
//Give it a value
result = (int)i;
}
}
}
if (result == null)
{
//Search the ints list
foreach(string s in m_lStrs)
{
if (s == sSearchCritera)
{
//Give it a value
result = (string)s;
}
}
}
//Return the results
return result;
}
//定义所有全局类变量
List m_lInts=新列表();
List m_lStrs=新列表();
公共静态对象FindMyObject(字符串sSearchCritera)
{
//初始化变量
对象结果=空;
如果(结果==null)
{
//搜索ints列表
foreach(单位:m_lInts)
{
如果(i.ToString()==sSearchCritera)
{
//给它一个价值
结果=(int)i;
}
}
}
如果(结果==null)
{
//搜索ints列表
foreach(m_lStrs中的字符串s)
{
如果(s==sSearchCritera)
{
//给它一个价值
结果=(字符串)s;
}
}
}
//返回结果
返回结果;
}
第一个问题我们可以回答,但第二个问题属于微软(我们只能推测)。是的,但他们可以做一些经典的语法糖魔术,其中var?i=0
编译成var i=(int?)0
,因此对于我们来说,它更容易键入,并且应该更容易实现。比完全返工var
使其成为一种类型更容易