Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.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#中使用隐式类型的可空变量?_C#_.net 3.5_Nullable_Var - Fatal编程技术网

c#中使用隐式类型的可空变量?

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设置为可为null的类型

这隐式地将i类型化为int,但是如果我想要一个可为null的int呢

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
      使其成为一种类型更容易