我正在尝试创建一个变量Guid?表示可以为空的db列。我在分配价值时遇到问题。我能够轻松地为变量赋值null。但是当我想分配一个Guid值时,我必须创建一个新的Guid?不接受字符串的对象。
Guid? sample=new Guid?(someString); // erroing "Cannot implicitly convert string to Guid"
所以我必须这样做
Guid? sample=new Guid?(new Guid(someString)); // working code
我也有条件地分配值。
Guid? sample=(string.IsNullOrWhiteSpace(someString))?null: new Guid?(new Guid(someString));
为什么Guid会出现这个问题?
答案 0 :(得分:6)
但是当我想分配一个Guid值时,我必须创建一个新的Guid?不接受字符串的对象。
您可以将代码缩短为:
Guid? sample= new Guid(someString);
Nullable Types可以直接分配<T>
类型。
int? i = 1;
int? i2 = null;
bool? b = true;
bool? b2 = null;
答案 1 :(得分:3)
Guid? sample = new Guid?(new Guid(someString));
这没有多大意义。您有一个可以为null的类型,以便能够存储空值。但是,无论如何分配值 ,它都不会为空。类型的构造函数实际上永远不会返回null,因此new Guid(someString)
将始终返回有效的Guid
- 或者当然会抛出异常。因此,您可以将结果Guid
分配给可空类型的变量:
Guid? sample = new Guid(someString);
如果您想考虑无效输入,例如如果someString
为空或者不是有效Guid
,则可以使用Guid.TryParse
(.NET 4.0或更高版本):
Guid? sample = null;
Guid parsed;
if (Guid.TryParse(someString, out parsed))
sample = parsed;
请注意,这样您就可以删除someString
上的任何其他检查。您可以传入空字符串或其他任何内容,TryParse
将返回false,保留sample
的默认值。
答案 2 :(得分:2)
因为Guid
有一个带string
参数的构造函数。但是可以为空的Guid(Guid?)只接受Guid
作为参数。