0

これは、メッセージが表示される C# クラスの更新バージョンです。

到達不能なコードが検出されました: DateTime.Now.Ticks;

他のすべては問題ないようです。私の間違いはどこですか?

using System;
using System.Globalization;

namespace domain
{
    public class Request : Unique
    {
        private DateTime dateBooked_Renamed;

        private DateTime dateSignedIn ;

        private DateTime dateSignedOut ;

        private bool arrived_Renamed = false;

        private bool paid_Renamed = false;

        private Hotel hotel_Renamed;

        private Employee employee_Renamed;

        private int numberOfNights;

        public Request(Hotel hotel, Employee employee, string dateBooked, string dateArrived, int numberOfNights)
            : base()
        {
            this.hotel_Renamed = hotel;
            this.employee_Renamed = employee;
            this.numberOfNights = numberOfNights;
            try
            {
                DateTime.ParseExact(dateBooked, "dd/MM/yyyy", CultureInfo.InvariantCulture);

                this.dateBooked_Renamed = DateTime.ParseExact(dateBooked, "dd/MM/yyyy", CultureInfo.InvariantCulture);
                this.dateSignedIn = DateTime.ParseExact(dateArrived, "dd/MM/yyyy", CultureInfo.InvariantCulture);
            }
            catch (FormatException e)
            {
                Console.WriteLine(e.ToString());
                Console.Write(e.StackTrace);
            }
        }

        public virtual bool checkout(double money, string date)
        {
            try
            {
                dateCheckedOut = DateTime.ParseExact(date, "dd/MM/yyyy", CultureInfo.InvariantCulture);

            }
            catch (FormatException e)
            {
                Console.WriteLine(e.ToString());
                Console.Write(e.StackTrace);
            }
            if (money >= price())
            {
                paid = true;
            }
            else
            {
                paid = false;
            }
            return paid_Renamed;
        }

        public virtual int days()
        {
            long tNow = dateSignedOut != null ? dateSignedOut.Ticks : DateTime.Now.Ticks; 
            long tThen = arrived ? dateArrived.Ticks : tNow;
            long diff = tNow - tThen;

            long secondInMillis = 1000;
            long minuteInMillis = secondInMillis * 60;
            long hourInMillis = minuteInMillis * 60;
            long dayInMillis = hourInMillis * 24;
            long yearInMillis = dayInMillis * 365;

            diff = diff % yearInMillis;
            long elapsedDays = diff / dayInMillis;

            return (int)elapsedDays;
        }

        public virtual Hotel hotel
        {
            get
            {
                return hotel_Renamed;
            }
            set
            {
                this.hotel_Renamed = value;
            }
        }

        public virtual DateTime dateArrived
        {
            get
            {
                return dateSignedIn;
            }
            set
            {
                this.dateSignedIn = value;
            }
        }

        public virtual DateTime dateBooked
        {
            get
            {
                return dateBooked_Renamed;
            }
            set
            {
                this.dateBooked_Renamed = value;
            }
        }

        public virtual DateTime dateCheckedOut
        {
            get
            {
                return dateSignedOut;
            }
            set
            {
                this.dateSignedOut = value;
            }
        }

        public virtual Employee employee
        {
            get
            {
                return employee_Renamed;
            }
            set
            {
                this.employee_Renamed = value;
            }
        }

        public virtual bool arrived
        {
            get
            {
                return arrived_Renamed;
            }
            set
            {
                this.arrived_Renamed = value;
            }
        }

        public virtual bool paid
        {
            get
            {
                return paid_Renamed;
            }
            set
            {
                this.paid_Renamed = value;
            }
        }

        public virtual double price()
        {
            // The total cost of the stay...

            double price = days() * employee_Renamed.type.price;
            if (hotel_Renamed.premium)
            {
                return price - (0.2 * price);
            }
            else
            {
                return price;
            }
        }



        public virtual bool hasArrivalDate(string date)
        {
            try
            {
                DateTime d = DateTime.ParseExact(date, "dd/MM/yyyy", CultureInfo.InvariantCulture);
                Console.WriteLine("Comparing " + d + " with " + dateSignedIn + " = " + dateSignedIn.ToString("dd/MM/yyyy").Equals(d.ToString("dd/MM/yyyy")));
                return dateSignedIn.ToString().Equals(d.ToString());
            }
            catch (FormatException e)
            {
                Console.WriteLine(e.ToString());
                Console.Write(e.StackTrace);
                return false;
            }
        }
    }
}
4

2 に答える 2

0

コードでは、dateSignedOut 変数は でありDateTime、null にすることはできません。

したがって、次の行で:

long tNow = dateSignedOut != null ? dateSignedOut.Ticks : DateTime.Now.Ticks;

dateSignedOut が null になることはないため、ステートメントの「else」部分に到達することはありません。

dateSignedOut を null 許容にする場合は、Nullable<DateTime>(またはDateTime?) にします。

余談ですが、読みやすいように質問をフォーマットしてください。これは本当に閉鎖の危機に瀕しています。より良い質問は、より良い答えにつながります。

コメントに基づいて更新

プロパティが一般的に C# でどのように記述されているかについてもう少し学習する必要がありますが、それはこの質問の範囲を超えています。すでに持っているコードを使用するには:

private DateTime? dateSignedOut;  // Notice the ? to make it Nullable
long tNow = dateSignedOut.HasValue ? dateSignedOut.Ticks : DateTime.Now.Ticks;

いくつかのMSDN ドキュメント、または Google Nullable 型を見てください。

于 2012-05-11T17:16:26.083 に答える
0

標準形式の日付文字列の場合は、使用できますDateTime.Parse(date)
。そうでない場合は、使用できますDateTime.ParseExact(date,"your custom format",CultureInfo.InvariantCulture)

コードのサンプルとして

public virtual bool hasArrivalDate(string date)
        {
            try
            {
                DateTime d = DateTime.ParseExact(date,"dd/MM/yyyy",CultureInfo.InvariantCulture);
                Console.WriteLine("Comparing " + d.ToString("dd/MM/yyyy") + " with " + dateSignedIn.ToString("dd/MM/yyyy") + " = " + dateSignedIn.ToString("dd/MM/yyyy").Equals(d.ToString("dd/MM/yyyy")));
                return dateSignedIn.ToString().Equals(d.ToString());
            }
            catch (FormatException e)
            {
                Console.WriteLine(e.ToString());
                Console.Write(e.StackTrace);
                return false;
            }
        }

したがって、DateFormat のインスタンスは必要ありません

于 2012-05-11T15:47:09.357 に答える