具有泛型的可空基元

时间:2010-08-27 10:43:14

标签: c# generics resharper nullable

我正在尝试在可空的布尔值上找到正确的非空验证。我也希望能够对其他一些领域做同样的事情,包括字符串,整数等,所以我想在方法中使用泛型。这是一个可能发生的事情的例子。

bool? myValue = null;
bool valid = ValidateNotNull(myValue);

这里有一些验证码:

public bool ValidateNotNull<T>(T nullableField)
{
    return nullableField != null;
}

我发现此类问题的所有答案都建议在方法签名中添加where T : structwhere T: class,或在比较中使用default(T),这些都不起作用对于false是有效值的布尔值。

还有其他建议吗?代码编译,但Resharper对于它认为可能是原始值的值的空值比较并不满意,我很想知道我应该做些什么来为它加油。

注意:这不是完整的代码。我仍然有兴趣保持这种类型。这也不是我遇到问题的唯一地方。

NB2:是的,它编译并正常工作。我真正想知道的是,是否有一个代码解决方案可以阻止Resharper抱怨,或者是一种惯用的方法来做这个我不知道的事情。

5 个答案:

答案 0 :(得分:5)

以下代码将验证可空类型和引用类型:

 public bool ValidateNotNull<T>(Nullable<T> nullableField) where T:struct
 {
  return nullableField.HasValue;
 }

 public bool ValidateNotNull<T>(T nullableField) where T:class
 {
  return nullableField!=null;
 }

答案 1 :(得分:3)

会比较默认工作吗?

    public bool ValidateNotNull<T>(T nullableField)
    {
        return Equals(nullableField, default(T));
    } 

<强>更新

它是一个primitive,一切都很好,或者它不是空的:

    public bool ValidateNotNull<T>(T nullableField)
    {
        return typeof(T).IsPrimitive || !Equals(nullableField, null);
    }

答案 2 :(得分:2)

  

我也希望能够对其他一些领域做同样的事情,包括字符串,整数等等。

好的,所以你想要一个可以传递Nullable<>struct)或引用类型的方法,并且如果参数是{true则返回null {1}}(请注意,你的名字似乎是错误的,但你去了)。

问题是,如果那个所有这个方法必须要做,那么你就不需要泛型,因为你不需要类型安全。我想这个例子可以运行并做你想做的事情:

class Program
{
    static void Main(string[] args)
    {
        int? x = null;
        int? y = 5;
        string s = null;
        string r = "moo";

        Console.WriteLine(ValidateNotNull(x));
        Console.WriteLine(ValidateNotNull(y));
        Console.WriteLine(ValidateNotNull(s));
        Console.WriteLine(ValidateNotNull(r));

        Console.ReadLine();

    }

    private static bool ValidateNotNull(object o)
    {
        return o == null;
    }
}

此输出

True
False
True
False

我相信你需要的输出。

答案 3 :(得分:0)

我不知道为什么你的方法不起作用(除了使用!=而不是==),因为据我所知,它已经有效了!您可以将T类型的任何值与null进行比较(当T是泛型类型参数时)。如果对T使用非可空值类型,则结果将被视为常量(false== nulltrue!= null

所以,这应该没问题。

public bool ValidateNotNull<T>(T nullableField)
{
    return nullableField != null;
}

但是这也可以在没有泛型的情况下发挥作用:

public bool ValidateNotNull(object nullableField)
{
    return nullableField != null;
}

(因为装箱Nullable<T>空值会返回空引用。)

答案 4 :(得分:-2)

您需要使用

public bool ValidateNotNull<T>(T nullableField)
{
    return nullableField.HasValue;
}