Null в аргументах String.Format создает исключение NullReferenceException, даже если аргумент отсутствует в результирующей строке - PullRequest
4 голосов
/ 18 февраля 2010

У меня есть null в одном из аргументов в String.Format(), поэтому call throws NullReferenceException. Почему проверка происходит, даже если аргумент не находится в результирующей строке?

class Foo
{
    public Exception Ex { get; set; }
}

class Program
{
    public static void Main(string[] args)
    {
        var f1 = new Foo() { Ex = new Exception("Whatever") };
        var f2 = new Foo();         

        var error1 = String.Format((f1.Ex == null) ? "Eror" : "Error: {0}", f1.Ex.Message); // works
        var error2 = String.Format((f2.Ex == null) ? "Eror" : "Error: {0}", f2.Ex.Message); // NullReferenceException 
    }
}

Есть ли обходные пути, кроме двух вызовов, разделенных if()?

Ответы [ 2 ]

8 голосов
/ 18 февраля 2010

Это потому, что вы в конечном итоге оцените f2.Ex.Message в любом случае.

Должно быть:

var error2 = (f2.Ex == null) ? "Eror" : String.Format("Error: {0}", f2.Ex.Message);
6 голосов
/ 18 февраля 2010

Исключение вызывает не string.Format, а вот это: f2.Ex.Message. Вы вызываете метод получения Message для Ex со значением NULL.

...