我使用"bool"类型作为变量,就像我在C++中习惯的那样,并且我尝试将我期望的函数或属性的值放入我的变量中.但是我经常遇到结果类型是"bool?"的情况.而不是"bool",隐式转换失败.
两者之间有什么区别,每次使用的时间是多少?另外,我应该使用"bool?" 作为我的变量的类型?这是最好的做法吗?
C#switch语句的默认标签如何处理可以为空的枚举?
默认标签是否会捕获空值和任何未处理的案例?
int value=0;
if (value == 0)
{
value = null;
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能设置value到null上面?
任何帮助将不胜感激.
这是一种我无法理解的怪异行为.在我的例子我有一个类Sample<T>和隐式转换操作符T来Sample<T>.
private class Sample<T>
{
public readonly T Value;
public Sample(T value)
{
Value = value;
}
public static implicit operator Sample<T>(T value) => new Sample<T>(value);
}
Run Code Online (Sandbox Code Playgroud)
使用空值类型为出现问题时,T例如int?.
{
int? a = 3;
Sample<int> sampleA = a;
}
Run Code Online (Sandbox Code Playgroud)
这里是关键部分:
在我看来,这不应该编译,因为Sample<int>定义了一个转换,从int以Sample<int>而不是从int?到Sample<int>.但它编译并成功运行!(我的意思是调用转换运算符3并将其分配给该readonly字段.)
它变得更糟.这里不调用转换运算符,sampleB将其设置为null:
{
int? b = null;
Sample<int> sampleB = b; …Run Code Online (Sandbox Code Playgroud) 在C#中,可以为空的原始类型(即bool?)只是它们对应Nullable<T>类型的别名,还是两者之间存在差异?
我有一个DateTime?我正在尝试使用a插入字段DbParameter.我正在创建这样的参数:
DbParameter datePrm = updateStmt.CreateParameter();
datePrm.ParameterName = "@change_date";
Run Code Online (Sandbox Code Playgroud)
然后我想把s 的值DateTime?放到dataPrm.Valuewhile中null.
我以为我最初很聪明:
datePrm.Value = nullableDate ?? DBNull.Value;
Run Code Online (Sandbox Code Playgroud)
但是因错误而失败
接线员'??' 不能应用于'System.DateTime?'类型的操作数 和'System.DBNull'
所以我想这只有在第二个参数是第一个参数的非可空版本时才有效.那么我去了:
datePrm.Value = nullableDate.HasValue ? nullableDate.Value : DBNull.Value;
Run Code Online (Sandbox Code Playgroud)
但这也不起作用:
无法确定条件表达式的类型,因为'System.DateTime'和'System.DBNull'之间没有隐式转换
但我不想在这些类型之间进行转换!
到目前为止,我唯一可以上班的是:
if (nullableDate.HasValue)
datePrm.Value = nullableDate.Value;
else
datePrm.Value = DBNull.Value;
Run Code Online (Sandbox Code Playgroud)
这真的是我写这个的唯一方法吗?有没有办法使用三元运算符来实现单线程?
更新:我真的不明白为什么?? 版本不起作用.MSDN说:
?? ?? 如果左侧操作数不为null,则运算符返回左侧操作数,否则返回右侧操作数.
这正是我想要的!
Update2:最后有点明显:
datePrm.Value = nullableDate ?? (object)DBNull.Value;
Run Code Online (Sandbox Code Playgroud) struct AccountInfo
{
String Username;
String Password;
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我想要一个Nullable实例,我应该写:
Nullable<AccountInfo> myAccount = null;
Run Code Online (Sandbox Code Playgroud)
但我希望struct Nullable自然而然地可以像这样使用(不使用Nullable<T>):
AccountInfo myAccount = null;
Run Code Online (Sandbox Code Playgroud) 可能是一个简单的问题,但我尝试了所有的转换方法!它仍然有错误!你能帮我吗?
十进制?(可以为十进制)到十进制
我试图使用Export to Excell,PDF,TextFile生成报告.好吧,我在MVC中这样做.我有一个名为SPBatch的类(我的SQL中存储过程的确切名称),它包含以下内容:
public string BatchNo { get; set; }
public string ProviderName { get; set; }
public Nullable<System.Int32> NoOfClaims { get; set; }
public Nullable<System.Int32> TotalNoOfClaims { get; set; }
public Nullable<System.Decimal> TotalBilled { get; set; }
public Nullable<System.Decimal> TotalInputtedBill { get; set; }
public Nullable<System.DateTime> DateCreated { get; set; }
public Nullable<System.DateTime> DateSubmitted { get; set; }
public Nullable<System.DateTime> DueDate { get; set; }
public string Status { get; set; }
public string RefNo { get; set; } …Run Code Online (Sandbox Code Playgroud) 我目前使用这个方便的转换扩展方法来进行类型之间的转换:
public static T To<T>(this IConvertible obj)
{
return (T)Convert.ChangeType(obj, typeof(T));
}
Run Code Online (Sandbox Code Playgroud)
但是,它不喜欢将有效值转换为Nullable,例如,这会失败:
"1".To<int?>();
Run Code Online (Sandbox Code Playgroud)
显然,1很容易转换为(int?),但它得到错误:
Invalid cast from 'System.String' to 'System.Nullable`1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'.
Run Code Online (Sandbox Code Playgroud)
这是一个明显简化的例子,实际上我用它来做字符串类型的转换,如下所示:
packageDb.Quantity = package.package.ElementDeep(Namespace + "PackageQuantity", Namespace + "ActualQuantity", Namespace + "Quantity").ValueOrNull().To<int?>();
Run Code Online (Sandbox Code Playgroud)
如果Convert.ChangeType不喜欢Nullable,那么任何人都有什么好主意吗?