2

我正在实现一个 TryParse(string s, Out object result) 方法。如果解析失败,我不想触及 out 参数,因此任何先前的结果都将保持不变。但是VS2k8不会让我。无论如何,我都必须设置 out 对象的值。

为了取悦编译器,我应该只放 result = result 吗?我错过了什么吗?

4

6 回答 6

7

分配 null (或更一般的 default(T) )。您必须分配一个值,这就是“出”的意思。

于 2009-05-14T08:34:06.917 回答
6

您的建议result = result不起作用,因为它是一个参数 - 它并不是从一开始就明确分配的,因此在您为其分配值之前,out无法读取它的值。

result = null;

绝对是获取objectout 参数的正确方法。基本上用于您拥有default(T)的任何类型。T(该default运算符在泛型方法中很有用——对于非泛型代码,我通常只使用null, 0 等。)

编辑:根据鲍里斯的评论,可能值得详细说明ref参数和out参数之间的区别:

输出参数

  • 不必由调用者明确指定
  • 在方法开始时被视为“未明确分配”(如果不先分配就无法读取值,就像局部变量一样)
  • 必须在方法正常终止之前(即在它返回之前;它可以在不给参数赋值的情况下抛出异常)明确地分配(由方法)

参考参数

  • 必须由调用者明确指定
  • 在方法开始时被视为“明确分配”(因此您可以在不先分配的情况下读取值)
  • 不必在方法内赋值(即您可以保留参数的原始值)
于 2009-05-14T08:36:47.143 回答
2
result = null;
于 2009-05-14T08:34:00.740 回答
0

只需输入一些默认值。例如 Int32.TryParse 方法置零。

于 2009-05-14T08:34:45.840 回答
0

You could use ref instead of out if you don't want to assign a value, although this must then be initialised by the caller.

于 2009-05-14T08:45:23.973 回答
-3

您可以在应该设置结果的代码之前抛出异常。

于 2009-05-14T08:39:38.073 回答