-1

Given a = null Shouldn't this not throw an exception?

if(a != null && ((string)a).ToLower()=="boo"){
  ... operation
}

Due to lazy evaluation the second statement should never be called so this ((string)a).ToLower() shouldn't be throwing an exception right ?

UPDATE

IOrderedEnumerable<SPListItem> Items = sourceList.GetItems("ProjectID", "Title", "ProjectName", "Featured", "Size", "Description")
    .Cast<SPListItem>().AsEnumerable().OrderBy((i => rnd.Next()));

SPListItemCollection randProjImages = SPContext.Current.Web.Lists.TryGetList("Random Projects Images").GetItems();
var randomImgNrs = Enumerable.Range(0, randProjImages.Count).OrderBy(i => rnd.Next()).ToArray();

Dictionary<string, string> projectImages = new Dictionary<string,string>();
IEnumerable<SPListItem> projImages = SPContext.Current.Web.Lists.TryGetList("Assigned Projects Images").
    GetItems().Cast<SPListItem>().AsEnumerable();
foreach (SPListItem it in projImages) projectImages.Add((string)it["ProjectID"], (string)it["ServerUrl"]);

int qCount = 0;
foreach (SPListItem item in Items) {
    if (item["Size"] != null && item["Featured"]!=null &&
            ((string)item["Size"]).ToLower() == "big" || ((string)item["Featured"]).ToLower() == "yes") {
        dataItems.Add(new Project(item["ProjectID"].ToString(), (string)item["Title"],
            "/sites/Galileo/SitePages/" + Utils.getCurrentLang().ToLower() + "/Projects.aspx#id=pwp" + item["ProjectID"],
            projectImages[(string)item["ProjectID"]],
            Utils.truncateString(item.Fields["Description"].GetFieldValueAsText(item["Description"]), 175), "project"));
    }else{

Replacing the foreach with this:

 foreach (SPListItem item in Items) {
            var k = item["Size"];
            if (item["Size"] != null && item["Featured"]!=null &&
                    ((string)item["Size"]).ToLower() == "big" || ((string)item["Featured"]).ToLower() == "yes") {
                dataItems.Add(new Project(item["ProjectID"].ToString(), (string)item["Title"],
                    "/sites/Galileo/SitePages/" + Utils.getCurrentLang().ToLower() + "/Projects.aspx#id=pwp" + item["ProjectID"],
                    projectImages[(string)item["ProjectID"]],
                    Utils.truncateString(item.Fields["Description"].GetFieldValueAsText(item["Description"]), 175), "project"));
            }else{

And breaking just before the if statement in the debugger, k == null

4

6 回答 6

4

if (item["Size"] != null && item["Featured"]!=null && ((string)item["Size"]).ToLower() == "big" || ((string)item[ "精选"]).ToLower() == "是")

它转到 ((string)item["Featured"]).ToLower() == "yes")

于 2013-05-28T23:31:11.890 回答
2

没有例外:

string a = null;
if (a != null && ((string) a).ToLower() == "boo")

string a = "";
if (a != null && ((string) a).ToLower() == "boo")

string a = "boo";
if (a != null && ((string) a).ToLower() == "boo")

这是应该的(尽管不需要强制转换)。

不编译:

T a = new T();
if (a != null && ((string) a).ToLower() == "boo")

T? a = null;
if (a != null && ((string) a).ToLower() == "boo")

T? a = new T();
if (a != null && ((string) a).ToLower() == "boo")

where是除了从 to 强制转换以外T的任何类型。 真正的问题是:为什么认为它会引发异常?stringTstring

于 2013-05-28T22:42:42.493 回答
1

利用

String.IsNullOrWhiteSpace(a)
于 2013-05-28T22:27:07.543 回答
1

如果第一个参数为假(ais null),则不评估 && 的第二个参数是对的。所以代码不能抛出 NullReferenceException。但是,如果ais notnull而是一个不能强制转换为 的对象,string则代码可能会引发 InvalidCastException。

请注意,以不区分大小写的方式比较字符串的最佳做法是使用String.Equals 方法

if (String.Equals(a, "foo", StringComparison.CurrentCultureIgnoreCase))
{
    // ... operation
}

由于该方法是静态的,因此不需要空值检查。

于 2013-05-28T22:55:03.570 回答
0

确切地说,这不会引发异常。由于您的表达式是AND,因此仅评估第一部分就足以知道它永远不会评估为真,因此跳过第二部分。

于 2013-05-28T22:27:19.250 回答
0

正确的!(除了它不称为惰性评估)

如果第一个操作数的计算结果为真,则不计算第二个操作数。

http://msdn.microsoft.com/en-us/library/vstudio/6373h346.aspx

于 2013-05-28T22:30:16.563 回答