ساختار Nullable<T> عملگرهایی مانند <, >, یا حتی == را تعریف نمیکند. با این وجود، کد زیر به درستی کامپایل شده و اجرا میشود:
int? x = 5; int? y = 10; bool b = x < y; // true
این موضوع به این دلیل کار میکند که کامپایلر عملگر کوچکتر از (less-than) را از نوع مقدار اصلی (underlying value type) قرض میگیرد یا به اصطلاح "بالا میبرد" (lift میکند). به صورت مفهومی، کامپایلر عبارت مقایسهای بالا را به این صورت ترجمه میکند:
bool b = (x.HasValue && y.HasValue) ? (x.Value < y.Value) : false;
به عبارت دیگر، اگر هر دو متغیر x و y دارای مقدار باشند، مقایسه از طریق عملگر کوچکتر از (less than) مربوط به نوع int انجام میشود؛ در غیر این صورت، مقدار false بازمیگرداند.
به عبارت دیگر، عملگرهای تعریفشده برای انواع مقدار (Value Types) بهطور خودکار برای انواع nullable آنها نیز کار میکنند. برای مثال، اگر عملگر + برای int تعریف شده باشد، به صورت خودکار برای Nullable<int> (یعنی int?) نیز قابل استفاده خواهد بود.
در سیشارپ، Operator Lifting به فرآیندی گفته میشود که طی آن عملگرها (Operators) برای انواع nullable (Nullable<T>) نیز پشتیبانی میشوند. این ویژگی امکان استفاده از عملگرهای ریاضی، منطقی و مقایسهای را برای انواع nullable فراهم میکند، بهطوری که رفتار عملگرها برای مقدار null بهدرستی مدیریت میشود.
فرض کنید میخواهید روی متغیرهایی کار کنید که ممکن است مقدار null داشته باشند. بدون پشتیبانی از Operator Lifting، باید قبل از هر عملیات، وجود مقدار (HasValue) را بهصورت دستی بررسی کنید. اما سیشارپ این کار را با قابلیت lifting ساده کرده است.
در زیر یک مثال ساده از عملیات ریاضی روی انواع nullable آورده شده است:
int? a = 10; int? b = null; int? result = a + b; Console.WriteLine(result); // Output: null
a برابر 10 است و مقدار b برابر null.+، به دلیل اینکه یکی از متغیرها null است، نتیجه نیز null میشود.عملگرهای زیر در سیشارپ برای انواع nullable lifted شدهاند:
+, -, *, /, %<, >, <=, >=, ==, !=&, |, ^int? x = 5; int? y = null; bool isEqual = x == y; // Output: false
double? value1 = 2.5; double? value2 = null; double? sum = value1 * 3 + value2; // Output: null
null باشد، نتیجه معمولاً null خواهد بود.&& یا ||، رفتار بر اساس قوانین کوتاهسازی (short-circuiting) عملگرها تنظیم میشود.قابلیت Operator Lifting یکی از ویژگیهای بسیار کاربردی در سیشارپ است که باعث سادهتر شدن کار با انواع nullable میشود. این قابلیت به توسعهدهندگان اجازه میدهد تا کدهای خواناتر، مختصرتر و امنتر در برابر خطاهای مرتبط با null بنویسند.