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

时间:2009-02-11 15:54:44

标签: c# .net-3.5 nullable var

是否有var可以为可空的类型?

这隐式地将i键入为int,但是如果我想要一个可以为空的int?

var i = 0;

为什么不支持这个:

var? i = 0;

7 个答案:

答案 0 :(得分:5)

var由赋值右侧的表达式或常量隐式输入。 var本身并不是一种类型,因此Nullable<var>是不可能的。

答案 1 :(得分:3)

为什么支持它?如果这就是你的意思,你应该说var i = (int?)0;

(好吧,你应该只说int? i = 0,但对于更复杂的类型等等。)

答案 2 :(得分:2)

问题涉及可空类型。

例如,您无法创建可为空的字符串,这反过来会阻止您创建可空的var,因为var可能是一个字符串。

答案 3 :(得分:0)

我的回答是这样的。 “var”是隐式输入的。它通过赋值右侧提供的值计算出它的类型。如果你告诉它它可以为空,它就不知道它是什么类型。请记住,一旦它被分配,那就是永远的类型。

答案 4 :(得分:0)

试试这个 - 这就是你所说的吗?

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

答案 5 :(得分:0)

VAR是编译时编译器确定的隐式类型。它在首次使用时分配。 IE设置var I = 1时,var是一个int,因为这就是数字1。如果您改为使用var I = SomeFunction(),其中某些函数返回一个可空的int,而不是我将设置为int?。现在,在你想要控制变量类型的情况下,不应该使用var。

所以底线,根据你的示例使用var是错误的,应该显式设置为int?从一开始。

  • Darroll

答案 6 :(得分:0)

在这种情况下,我甚至不会使用var。如果它是一个复杂的类型或一个简单的类型,如int,我会使用type&#34; object&#34;。

示例:

//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;
}