我正在尝试在可空的布尔值上找到正确的非空验证。我也希望能够对其他一些领域做同样的事情,包括字符串,整数等,所以我想在方法中使用泛型。这是一个可能发生的事情的例子。
bool? myValue = null;
bool valid = ValidateNotNull(myValue);
这里有一些验证码:
public bool ValidateNotNull<T>(T nullableField)
{
return nullableField != null;
}
我发现此类问题的所有答案都建议在方法签名中添加where T : struct
或where T: class
,或在比较中使用default(T)
,这些都不起作用对于false
是有效值的布尔值。
还有其他建议吗?代码编译,但Resharper对于它认为可能是原始值的值的空值比较并不满意,我很想知道我应该做些什么来为它加油。
注意:这不是完整的代码。我仍然有兴趣保持这种类型。这也不是我遇到问题的唯一地方。
NB2:是的,它编译并正常工作。我真正想知道的是,是否有一个代码解决方案可以阻止Resharper抱怨,或者是一种惯用的方法来做这个我不知道的事情。
答案 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
为== null
,true
为!= 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;
}