سؤال

EmployeeNumber =
string.IsNullOrEmpty(employeeNumberTextBox.Text)
    ? null
    : Convert.ToInt32(employeeNumberTextBox.Text),

غالبا ما أجد نفسي الرغبة في أن تفعل أشياء من هذا القبيل (EmployeeNumber هو Nullable<int> كما انها مكان الإقامة على LINQ إلى SQL dbml الكائن حيث العمود يسمح قيم فارغة).للأسف المترجم يشعر أنه "لا يوجد التحويل الضمني بين 'null' و 'int'", على الرغم من أن كلا النوعين قد تكون صالحة في مهمة عملية nullable الباحث من تلقاء نفسها.

Null ائتلافه المشغل ليس خيارا بقدر ما أستطيع أن أرى بسبب مضمنة التحويل يجب أن يحدث على .سلسلة نصية إذا لم تكن فارغة.

بقدر ما أعرف الطريقة الوحيدة للقيام بذلك هو استخدام جملة if و/أو تعيين في خطوتين.في هذه الحالة بالذات أجد أنه محبط للغاية لأنني أردت استخدام الكائن مهيئ بناء الجملة هذا التعيين سيكون في تهيئة كتلة...

أحد يعرف أكثر أناقة الحل ؟

هل كانت مفيدة؟

المحلول

تحدث هذه المشكلة لأن المشروط المشغل لا ننظر في كيفية استخدام قيمة (تعيين في هذه الحالة) إلى تحديد نوع من التعبير فقط true/false القيم.في هذه الحالة لديك null و Int32, ونوع لا يمكن تحديد (هناك أسباب حقيقية لا يمكن أن نفترض فقط Nullable<Int32>).

إذا كنت حقا ترغب في استخدامه في هذه الطريقة ، يجب أن يلقي واحدة من القيم Nullable<Int32> نفسك, لذلك C# يمكن حل هذا النوع:

EmployeeNumber =
    string.IsNullOrEmpty(employeeNumberTextBox.Text)
    ? (int?)null
    : Convert.ToInt32(employeeNumberTextBox.Text),

أو

EmployeeNumber =
    string.IsNullOrEmpty(employeeNumberTextBox.Text)
    ? null
    : (int?)Convert.ToInt32(employeeNumberTextBox.Text),

نصائح أخرى

أعتقد الأداة طريقة يمكن أن تساعد على جعل هذا المنظف.

public static class Convert
{
    public static T? To<T>(string value, Converter<string, T> converter) where T: struct
    {
        return string.IsNullOrEmpty(value) ? null : (T?)converter(value);
    }
}

ثم

EmployeeNumber = Convert.To<int>(employeeNumberTextBox.Text, Int32.Parse);

في حين أن أليكس يوفر الصحيح و الداني الإجابة على سؤالك, أنا أفضل أن استخدام TryParse:

int value;
int? EmployeeNumber = int.TryParse(employeeNumberTextBox.Text, out value)
    ? (int?)value
    : null;

انها أكثر أمانا و يعتني حالات إدخال غير صالح وكذلك سلسلة فارغة السيناريو.وإلا إذا كان المستخدم المدخلات شيء مثل 1b سيتم تقديمك مع وجود خطأ في الصفحة مع استثناء غير معالج تسبب في Convert.ToInt32(string).

يمكنك أن يلقي الناتج من التحويل:

EmployeeNumber = string.IsNullOrEmpty(employeeNumberTextBox.Text)
   ? null
   : (int?)Convert.ToInt32(employeeNumberTextBox.Text)
//Some operation to populate Posid.I am not interested in zero or null
int? Posid = SvcClient.GetHolidayCount(xDateFrom.Value.Date,xDateTo.Value.Date).Response;
var x1 = (Posid.HasValue && Posid.Value > 0) ? (int?)Posid.Value : null;

تحرير:شرح أعلاه ، كنت أحاول الحصول على قيمة Posid (إذا nonnull int وبعد أن قيمة أكبر من 0) في varibale X1.اضطررت لاستخدام (int?) على Posid.Value للحصول على المشروط المشغل لا رمي أي خطأ الترجمة.فقط لمعلوماتك GetHolidayCount هو WCF الطريقة التي يمكن أن تعطي null أو أي عدد.على أمل أن يساعد

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top