【发布时间】:2013-01-22 20:24:57
【问题描述】:
所以我最近与 Javascript 和 WinRT 面对面交流。基本上,我正在开发一个 WinRT API,所以它应该可以很好地与 Javascript、C++ 和 C# 配合使用。如果传入的值为空,我在 API 中有一个属性可以执行特殊操作。所以,例如:
public string Foo
{
get
{
return foobar.ToString();
}
set
{
if(string.IsNullOrEmpty(value))
{
foobar=SomeSpecialValue;
return;
}
ParseIntoFoobar(value);
}
}
对我来说,这似乎是一个完美的属性。但是,当您在 Javascript 中使用类似这样的内容时:
myFoobar.foo=null;
结果是ParseIntoFoobar抛出解析异常,为什么?因为显然 Javascript 中 null 的值是 "null",就像 一个包含单词 null`的字符串
从我看到的文档来看,这应该导致 C# 转换为 null,或者它应该导致一个空字符串,而不是这个愚蠢的结果。事实上,你可以做出一些对我来说毫无意义的非常不直观的行为。投影:
public string Biz{get;set;}
Javascript:
myObject.biz=null;
log(myObject.biz==null); //results in false
解决此“功能”的最佳方法是什么?我应该如何处理我想要检测空值但"null" 作为字符串并不完全无效的情况? (想想用户名之类的)
【问题讨论】:
-
@bfavaretto 好吧,在 WinRT 中没有空字符串。我没问题。在 C++ 中,传递给字符串参数的空指针将导致一个空字符串......但这不是一个空字符串。这可能是迄今为止我见过微软做的最奇怪的事情
-
不会是
public string? Biz{get;set;}吗? -
@bfavaretto no 因为string已经是引用类型,WinRT中没有null这种东西
-
对不起,我对 WinRT 一无所知。但维基百科说:“在 WinRT 中,字符串是不可变的,不允许空值。如果空值通过具有空语义的语言传递给 WinRT 中的字符串,则该值将转换为空字符串。” en.wikipedia.org/wiki/Windows_Runtime#Restrictions_and_rules 所以应该转换成
"",而不是"null"... -
@bfavaretto 是的,这就是我的观点……但事实并非如此
标签: c# javascript null windows-runtime projection