我试图在可空的布尔值上找到一个非空验证的正确方法.我也希望能够对其他一些领域做同样的事情,包括字符串,整数等,所以我想在方法中使用泛型.这是一个可能发生的事情的例子.
bool? myValue = null;
bool valid = ValidateNotNull(myValue);
Run Code Online (Sandbox Code Playgroud)
这里有一些验证码:
public bool ValidateNotNull<T>(T nullableField)
{
return nullableField != null;
}
Run Code Online (Sandbox Code Playgroud)
我发现这类问题的所有答案都建议在方法签名中添加一个where T : struct或者where T: class,或者default(T)在比较中使用,这些都不适用于bool,其中false有效值.
还有其他建议吗?代码编译,但Resharper对于它认为可能是原始值的值的空值比较感到不满意,而且我很想知道我应该做些什么来振作起来.
注意:这不是完整的代码.我仍然有兴趣保持这种类型.这也不是我遇到问题的唯一地方.
NB2:是的,它编译并正常工作.我真正想知道的是,是否有一个代码解决方案可以阻止Resharper抱怨,或者是一种惯用的方法来做这个我不知道的事情.
我有一个LINQ语句,它工作得很好......它的选择就在这里
select new
{
Net = (System.Double?)
((from m0 in MOVTOS
where m0.DocumentType == "NET" && m0.ClientCode == c.ClientCode
group m0 by new { 0.ClientCode } into g
select new
{
Expr1 = (System.Double)g.Sum(p => p.Amount)
}).First().Expr1)
};
Run Code Online (Sandbox Code Playgroud)
现在,如果你注意到我正在使用System.Double?(可以为空的双重)作为一个演员在乞讨,因为一些值在SUM上返回为NULL.
如果我将其更改为System.Double,则会失败并显示错误
无法将null值分配给类型为System.Double的成员,该成员是非可空值类型
所以我想要做的是返回SUM的值,但如果它是NULL,那么在那里输入0.
任何帮助真的很感激
我试图理解为什么两个代码示例的行为不同.我一直认为If()函数可以模仿If语言特性.或者我是否正在查看导致此问题的Nullable(Of Integer)行为?
样品#1:
If Not String.IsNullOrWhiteSpace(PC.SelectedValue) Then
Dim pcFilter1 As Integer? = CInt(PC.SelectedValue)
Else
Dim pcFilter1 As Integer? = Nothing
End If
Run Code Online (Sandbox Code Playgroud)
样品#2:
Dim pcFilter2 As Integer? = If(Not String.IsNullOrWhiteSpace(PC.SelectedValue),
CInt(PC.SelectedValue),
Nothing)
Run Code Online (Sandbox Code Playgroud)
结果:
pcFilter1 =没什么
pcFilter2 = 0
我有以下实体模型:
public class Todo
{
[Required]
public int ID { get; set; }
public int OrderId { get; set; } //Not required
public string Description { get; set; }
public bool Finished { get; set; }
public DateTime CreationDate { get; set; }
public int Priority { get; set; } //Not required
public string CreatedBy { get; set; }
public bool Deleted { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在相应的数据库表中,所有字段都创建为"not null".我想允许一些字段为空.我该怎么做呢?
这种事情总是出现,
这有效但很难看:
DateTime? firstDay = null;
if (Day.HasValue) firstDay = Day.Value.AddDays(-14);
Run Code Online (Sandbox Code Playgroud)
这不起作用:
约会时间?firstDay = Day.HasValue?Day.Value.AddDays(-14):null;
除非:
DateTime? firstDay = Day.HasValue ? Day.Value.AddDays(-14) : (DateTime?)null;
Run Code Online (Sandbox Code Playgroud)
也许应该有另一个运营商!
DateTime? firstDay = Day ??? Day.Value.AddDays(-14);
Run Code Online (Sandbox Code Playgroud) 在C#中
int? a1 = 0;
int? a2 = 100;
a1 = a1 | default(int?);
a2 = a2 | default(int?);
bool? a1 = null; bool? a2 = true; a1 = a1 | default(bool?); a2 = a2 | default(bool?);
这段代码没有发出警告,说表达式的结果总是为null.推断的原因是'I_dont_know'| int ='I_dont_know',其中'I_dont_know'| true = true
如我错了请纠正我
我写了这个简单的实用函数:
public static T isNull<T>(T? v, T d)
{
return v == null ? d : v.Value;
}
Run Code Online (Sandbox Code Playgroud)
目的是避免烦人的任务,例如检查成员是否为null,在读取linq记录集时非常常见.问题是它抛出了这个错误:
类型'T'必须是非可空值类型,以便在泛型类型或方法'System.Nullable <T>'中将其用作参数'T'
错误似乎是合法的,无论如何我希望我可以这样做:
int? myField = record.myField;
int myValue = isNull(myField, 0);
Run Code Online (Sandbox Code Playgroud)
代替:
int? myField = record.myField;
int myValue = myField == null ? 0 : myField.Value;
Run Code Online (Sandbox Code Playgroud)
我觉得我缺少一些c#基础知识.有没有办法完成我的任务?
这个问题更像是一种好奇心......
假设有一个类:
public class Foo{
public int? x {get; set;}
public int? y {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
在项目实例的某处创建了:
var foo1= new Foo
{
x= 1;
y= 1;
};
var foo2= new Foo
{
x= 1;
y= 1;
};
Run Code Online (Sandbox Code Playgroud)
如果由于某种原因他们想检查是否相互相等并将它们设置为NULL是否相同并打印到屏幕上...
例如:
if(foo1.x == foo2.x)
foo1.x = null;
if(foo1.y == foo2.y)
foo1.y = null;
if(foo1 == null){
Console.WriteLine("foo1 is NULL");
}else{
Console.WriteLine("foo1 is not NULL");
}
Run Code Online (Sandbox Code Playgroud)
哪个会打印?
foo1的实例存在,但它的所有对象都设置为NULL.我对可空类型的概念不熟悉,所以这给我带来了好奇心!(我的Visual Studio是在fritz或我自己测试)
在Class中Site,我有两种实用方法.
第一个,如果没有错误发生parseStub,则解析Site为a ; 否则,它返回.使用:Master nullOptional
public static Optional<Master> parseStub(Site site) {
// do some parse work; return Optional.empty() if the parse fails.
}
Run Code Online (Sandbox Code Playgroud)
第二种方法parseStubs是解析的列表Site到的列表Master.它重用parseStub,并且必须处理可能为空的Optional<Master>:
public static List<Master> parseStubs(List<Site> sites) {
return sites.stream()
.<Master>map(site -> Site.parseStub(site).orElse(null))
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)
请注意,在上面的代码中,我
null再次介绍.
我怎么能避免null(和filter(Objects::nonNull))使用Optional一致?
我偶然发现我不小心这样做了:
@javax.annotation.Nullable
@javax.validation.constraints.NotNull
Run Code Online (Sandbox Code Playgroud)
编译器没有抱怨,一切似乎都很好。
现在,我想知道当两个或更多注释相互矛盾时内部发生了什么。此外,顺序重要吗?
这是
@Nullable
@NotNull
Run Code Online (Sandbox Code Playgroud)
比这一样吗?
@NotNull
@Nullable
Run Code Online (Sandbox Code Playgroud)
一般来说,这对注释如何起作用?谁赢?
编辑:我正在寻找一个一般性的答案,不一定关于这两个注释