如何使用int.TryParse与可空int?

我正在尝试使用TryParse来查找string值是否是一个整数。 如果该值是一个整数,则跳过foreach循环。 这是我的代码。

string strValue = "42 " if (int.TryParse(trim(strValue) , intVal)) == false { break; } 

intVal是int?(可空INT)的variables。 我怎样才能使用Tryparse与可空int?

不幸的是,如果不使用其他variables,则不能这样做 – 因为out参数的types必须完全匹配参数。

像丹尼尔的代码一样,但用第二个参数修正,修剪,避免与布尔常量进行比较:

 int tmp; if (!int.TryParse(strValue.Trim(), out tmp)) { break; } intVal = tmp; 

这里有一个TryParse的可为空的选项

 public int? TryParseNullable(string val) { int outValue; return int.TryParse(val, out outValue) ? (int?)outValue : null; } 

无法阻止自己生成通用版本。 下面的用法。

  public class NullableHelper { public delegate bool TryDelegate<T>(string s, out T result); public static bool TryParseNullable<T>(string s, out T? result, TryDelegate<T> tryDelegate) where T : struct { if (s == null) { result = null; return true; } T temp; bool success = tryDelegate(s, out temp); result = temp; return success; } public static T? ParseNullable<T>(string s, TryDelegate<T> tryDelegate) where T : struct { if (s == null) { return null; } T temp; return tryDelegate(s, out temp) ? (T?)temp : null; } } bool? answer = NullableHelper.ParseNullable<bool>(answerAsString, Boolean.TryParse); 

您可以创build一个帮助器方法来parsing一个可为空的值。

用法示例:

 int? intVal; if( !NullableInt.TryParse( "42", out intVal ) ) { break; } 

帮手方法:

 public static class NullableInt { public static bool TryParse( string text, out int? outValue ) { int parsedValue; bool success = int.TryParse( text, out parsedValue ); outValue = success ? (int?)parsedValue : null; return success; } } 

你也可以为此做一个扩展方法;

 public static bool TryParse(this object value, out int? parsed) { parsed = null; try { if (value == null) return true; int parsedValue; parsed = int.TryParse(value.ToString(), out parsedValue) ? (int?)parsedValue : null; return true; } catch (Exception) { return false; } } 

我已经在objecttypes上做了这个扩展,但它也可以在string 。 就我个人而言,我喜欢这些parsing器扩展在任何对象上都可用,因此在object上的扩展而不是string

使用示例:

 [TestCase("1", 1)] [TestCase("0", 0)] [TestCase("-1", -1)] [TestCase("2147483647", int.MaxValue)] [TestCase("2147483648", null)] [TestCase("-2147483648", int.MinValue)] [TestCase("-2147483649", null)] [TestCase("1.2", null)] [TestCase("1 1", null)] [TestCase("", null)] [TestCase(null, null)] [TestCase("not an int value", null)] public void Should_parse_input_as_nullable_int(object input, int? expectedResult) { int? parsedValue; bool parsingWasSuccessfull = input.TryParse(out parsedValue); Assert.That(parsingWasSuccessfull); Assert.That(parsedValue, Is.EqualTo(expectedResult)); } 

不利的一面是,这会破坏分析值的框架语法;

 int.TryParse(input, out output)) 

但我喜欢它的较短版本(不pipe它是否可读性更强,可能会被讨论);

 input.TryParse(out output)