2

我不能返回 null 因为 myHlist是不可为空的类型。我还能返回什么来代替 null?

HList findHListentry(string letter)
{
    if (string.IsNullOrWhiteSpace(letter))
    {
        HList result = listentry.Find(delegate(HList bk)
                       {
                           return bk.letter == letter;
                       });
        return result;
    }
    else
    {
        return ?;
    }
}
4

7 回答 7

5

使用 aNullable<HList>代替?

HList? findHListentry(string letter)
{
    ///
    return null;
}
于 2012-08-09T20:19:47.357 回答
4

有几种处理不可为空值类型的方法:

  • 使用Nullable<HList>(它的简写名称是HList?),或
  • 定义一个“空”HList条目,类似于 Microsoft 为Guid
  • 使您的方法返回bool而不是HList,并HList通过out参数返回,它的完成方式Dictionary.TryGetValue

使用特殊值:

struct HList {
    public static HList Empty;
    ...
}

if (...) {
    return HList.Empty;
}

返回bool

bool findHListentry(string letter, out HList res) {
    ...
}
于 2012-08-09T20:21:33.367 回答
1

如果方法的输入确实不应该null空字符串,则可以抛出异常:

HList findHListentry(string letter)
{
    if (string.IsNullOrWhiteSpace(letter))
        throw new ArgumentNullException("letter");

    HList result = listentry.Find(
        delegate(HList bk)
        {
            return bk.letter == letter;
        }
    );

    return result;
}

(请注意,我还颠倒了条件逻辑,因为听起来您正在寻找与问题标题相反的内容。)

您还可以查看代码契约来验证方法的先决条件,而不是手动检查输入并引发异常。

于 2012-08-09T20:22:21.550 回答
0

你有几个选择:

如果HList是一个结构:

  1. 把它变成一个班级。然后你可以返回null。
  2. 将方法签名更改为HList? findHListentry(string letter)
于 2012-08-09T20:20:25.043 回答
0

您可能想查看Nullable of T

于 2012-08-09T20:20:56.950 回答
0

一种实现是提供一个不可空类型的 Empty 实例,并返回它来代替 null。以字符串为例...虽然 String 在 .NET 中是可空类型,但它包含一个名为 Empty 的内置只读字段,因此您可以使用 String 执行以下操作:

if(mystring == null)
{
    //My String Is Null
}

或者,你可以这样做

if(mystring == String.Empty)
{
    //My String is Empty
}

虽然它可能不是最好的方法,但您可以将 HList 的空实例添加到您的类/结构中。例如

HList findHListentry(string letter)
{
    if (string.IsNullOrWhiteSpace(letter))
    {
        HList result = listentry.Find(delegate(HList bk) { return bk.letter == letter; });
        return result;
    }
    else
    {
        return HList.Empty;
    }
}

public struct HList
{
    public const HList Empty;
}

现在您可以代替 null 执行此操作

if(myHList == HList.Empty)
{
    //My HList is Empty
}
于 2012-08-09T20:38:27.777 回答
0

如果您不想返回 null,则可以创建 HList 的静态实例,用于指示它是“空”值。

类似于 EventArgs.Empty

public static readonly HList EmptyHList = new Hlist() { /* initialise */ };

于 2012-08-09T20:23:52.817 回答