الشرطي مشغل المهمة مع Nullable<value> أنواع ؟
-
09-06-2019 - |
سؤال
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
أو أي عدد.على أمل أن يساعد