2014-10-27 2 views
2

Я очень новичок в этом вопросе. Этот код дает мне ошибку:Невозможно создать экземпляр статического класса 'System.Tuple'

Cannot create an instance of the static class 'System.Tuple'

Operator '!=' cannot be applied to operands of type 'bool' and 'int' 

Я не знаю, что я делаю неправильно. Может кто-нибудь сказать мне, что это неправильно

using(StreamReader rdr = new StreamReader("fileName")) 
{ 
    StringBuilder sb = new StringBuilder(); 
    Int32 nc = 0; 
    Char c; 
    Int32 lineNumber = 0; 
    while((nc == rdr.Read() !=-1)) 
    { 
     c = (Char)nc; 
     if(Char.IsWhiteSpace(c)) 
     { 
      if(sb.Length > 0) 
      { 
       yield return new Tuple(sb.ToString(), lineNumber); 
       sb.Length = 0; 
      } 

      if(c == '\n') lineNumber++; 
     } 
     else 
     { 
      sb.Append(c); 
     } 
    } 
    if(sb.Length > 0) yield return new Tuple(sb.ToString(), lineNumber); 
} 
+0

Попробуйте 'новый Tuple (sb.ToString(), lineNumber)' –

+0

Это 'while ((nc == rdr.Read()! = - 1))' предполагается, что это 'while ((n c = rdr.Read())! = -1) 'может быть? – SimpleVar

+0

Вместо того, чтобы использовать типы .NET Framework 'Int32' и' Char' для объявления ваших переменных, вместо этого используйте вместо них типы языка C# 'int' и' char'. Чтобы узнать, почему, см. [Int или Int32? Мне все равно?] (Http://stackoverflow.com/q/62503/1497596) и [В чем разница между строкой и строкой?] (Http://stackoverflow.com/q/7074/1497596). – DavidRR

ответ

8

классы кортежей требуют аргументов типа, которые вы должны предоставить:

yield return new Tuple<string, int>(sb.ToString(), lineNumber); 

в качестве альтернативы вы можете использовать Tuple.Create, который обычно позволяет аргументы типа должны быть выведены автоматически:

yield return Tuple.Create(sb.ToString(), lineNumber); 
+0

См. [Документ MSDN] (http://msdn.microsoft.com/en-us/library/system.tuple (v = vs.110) .aspx # code-snippet-2) фрагменты кода 2 и 3 –

Смежные вопросы