সাথে নুলযোগ্য টাইপ ইস্যু?: শর্তসাপেক্ষ অপারেটর


154

কেউ সি #। নেট 2.0 এ কেন কাজ করে তা ব্যাখ্যা করতে পারে:

    Nullable<DateTime> foo;
    if (true)
        foo = null;
    else
        foo = new DateTime(0);

... তবে এটি হয় না:

    Nullable<DateTime> foo;
    foo = true ? null : new DateTime(0);

পরবর্তী ফর্মটি আমাকে একটি সংকলন ত্রুটি দেয় "শর্তসাপেক্ষ অভিব্যক্তির প্রকারটি নির্ধারণ করা যায়নি কারণ '<নুল>' এবং 'সিস্টেম.ডেটটাইম' এর মধ্যে কোনও অন্তর্নিহিত রূপান্তর নেই" "

এমন নয় যে আমি প্রাক্তনটি ব্যবহার করতে পারি না, তবে দ্বিতীয় স্টাইলটি আমার বাকী কোডগুলির সাথে আরও সুসংগত।


12
ডেটটাইম ব্যবহার করে আপনি নিজেকে অনেক টাইপ করে বাঁচাতে পারবেন? পরিবর্তনের পরিবর্তে <ডেটটাইম>।
স্টিয়ার্ট জনসন

উত্তর:


325

এই প্রশ্নটি ইতিমধ্যে বেশ কয়েকবার জিজ্ঞাসা করা হয়েছে। সংকলক আপনাকে বলছে যে এটি কীভাবে রূপান্তরিত nullহয় তা জানে না DateTime

সমাধানটি সহজ:

DateTime? foo;
foo = true ? (DateTime?)null : new DateTime(0);

নোটটি রচনা করা Nullable<DateTime>যেতে পারে DateTime?যা আপনাকে টাইপিংয়ের একগুচ্ছ সংরক্ষণ করবে।


যথেষ্ট ভাল কাজ করে তবে এখন আপনি চেক ফু কে বাতিল করতে পারবেন না - এর সর্বদা একটি মান থাকবে। যদিও এর আশেপাশে কোনও উপায় নেই - মোজোফিল্টার যেমনটি বলেছেন "এটি কারণ যে কোনও তিনটি অপারেটরে, দুটি মান অবশ্যই একই রকমের হতে হবে।"
দিলবার্ট ডেভ

@ দিলবার্ট ডেভ মোজো ফিল্টার পোস্টের তথ্যটি ভুল।
মিশশাক

4
আমি যুক্ত করবো যে সংকলকটি নির্ধারিত ভেরিয়েবলটি না দেখে বরং পরিবর্তে অপারেশনগুলিতে দেখে টের্নারি অপারেশনের ফলাফলের ধরণের অনুমান করার চেষ্টা করে। এটি পাওয়া যায় <null>এবং DateTimeসাধারণ পূর্বপুরুষের ধরণের সন্ধান করার পরিবর্তে এটি একে অপরের মধ্যে রূপান্তর সন্ধান করার চেষ্টা করে। (অতিরিক্ত বিট: সি # একটি <null>null
টাইপকে

যদি ইতিমধ্যে অনেক বার জিজ্ঞাসা করা হয়, তবে সদৃশ প্রশ্ন পতাকাটি কোথায়?
স্টারম্যান্ডেলাক্স

@ স্টারম্যান্ডেলাক্স তারা সম্ভবত এখানে উল্লেখ করেছেন (কমপক্ষে যে আমি কীভাবে এখানে এসেছি)
স্কট চেম্বারলইন

19

এফওয়াইআই (অফটপিক, তবে নিফটি এবং নোলার ধরণের সাথে সম্পর্কিত) আমাদের কাছে কেবল একটি অপারেটর রয়েছে কেবল নল প্রকারের জন্য নাল কোলেসিং অপারেটর বলে called

??

এর মতো ব্যবহৃত:

// Left hand is the nullable type, righthand is default if the type is null.
Nullable<DateTime> foo;
DateTime value = foo ?? new DateTime(0);

9
এটি কীভাবে তার প্রশ্নের উত্তর দেয় ??
স্টুয়ার্ট জনসন

3
নিক কিছু শর্তটি সত্য হলে foo এ বাতিল করার চেষ্টা করছে। নূন কোলেসেস foo শূন্য হলে ডেটটাইম (0) নির্ধারণ করবে। দুটি সম্পূর্ণ অপ্রাসঙ্গিক।
জেরোমি ইরভাইন

4
অতএব এফওয়াইআই, অফটপিক তবে একটি দুর্দান্ত জিনিস।
ফ্লাইওয়াত

আহ, ঠিক আছে. এটি জেনে রাখা বেশ দরকারী।
জেরোমির ইরভিন

8

এটি কারণ যে কোনও তিনটি অপারেটরে, দুটি মান একই ধরণের সমাধান করতে হবে।


10
না, তাদের একই ধরণের হতে হবে না। হয় দ্বিতীয় অপারেন্ডটি অবশ্যই তৃতীয় অপারেন্ডের প্রকারের সাথে বা অন্য উপায়ে স্পষ্টভাবে রূপান্তরিত হতে হবে।
মিশশাক

3

আমি জানি এই প্রশ্নটি 2008 সালে জিজ্ঞাসা করা হয়েছিল এবং এটি এখন 5 বছর পরে কিন্তু উত্তর হিসাবে চিহ্নিত উত্তরটি আমাকে সন্তুষ্ট করে না। আসল উত্তরটি হ'ল ডেটটাইম একটি স্ট্রাক্ট এবং স্ট্রাক্ট হিসাবে এটি নাল সাথে সামঞ্জস্যপূর্ণ নয়। এটি সমাধানের আপনার দুটি উপায় রয়েছে:

প্রথমটি হ'ল ডেটটাইমের সাথে নালকে সামঞ্জস্য করা (উদাহরণস্বরূপ, ডেটটাইম-এ নাল কাস্ট? 70০ টি আপভোটের ভদ্রলোক যেমন পরামর্শ দেন বা অবজেক্ট বা ভ্যালু টাইপে নাল কাস্ট করেন)।

দ্বিতীয়টি হ'ল ডেটটাইমকে নালার সাথে সামঞ্জস্যপূর্ণ করা (উদাহরণস্বরূপ, ডেটটাইমকে ডেটটাইম টাইপ করুন?)।


3

গৃহীত এর অনুরূপ আর একটি সমাধান হ'ল সি # এর defaultকীওয়ার্ডটি ব্যবহার করা। জেনেরিকগুলি ব্যবহার করে সংজ্ঞায়িত করার সময় এটি যে কোনও প্রকারে প্রযোজ্য।

ওপির প্রশ্নের প্রয়োগের প্রয়োগের উদাহরণ:

Nullable<DateTime> foo;
foo = true ? default(DateTime) : new DateTime(0);

বর্তমান গৃহীত উত্তরের সাথে ব্যবহারের উদাহরণ দিন:

DateTime? foo;
foo = true ? default(DateTime) : new DateTime(0);

এছাড়াও, ব্যবহার করে default, আপনাকে ভেরিয়েবলটি nullableকোনও nullমান নির্ধারণের জন্য নির্দিষ্ট করার দরকার নেই । সংকলকটি নির্দিষ্ট ভেরিয়েবল-প্রকারের ডিফল্ট মানটি স্বয়ংক্রিয়ভাবে বরাদ্দ করবে এবং কোনও ত্রুটির সম্মুখীন হবে না। উদাহরণ:

DateTime foo;
foo = true ? default(DateTime) : new DateTime(0);

13
সত্য default(DateTime)নয়, নাল নয়, এটি " 1.1.0001 0:00:00", একইরকম new DateTime(0)
ইলিডানএস

@ ইলিডিএসএস 4, আমি বলিনি যে এটি সমান null, কেবলমাত্র এটি ব্যবহার করে default()আপনি এটি একটি nullableমানকে নির্ধারণ করতে পারেন (এমএসডিএন রাষ্ট্র হিসাবে)। উদাহরণ আমি দেখাতে বহুমুখিতা এটি ব্যবহার করা যেতে পারে প্রদর্শন Nullable<DateTime>, DateTime?এবং নিছক DateTime। আপনি যদি এটি ভুল বলে বিশ্বাস করেন তবে আপনি কি কোনও পিসিসি সরবরাহ করতে পারেন যেখানে এইগুলি ব্যর্থ হয়?
ফার্নিচার

3
ঠিক আছে, প্রশ্নকর্তা nullভেরিয়েবলের মধ্যে সঞ্চয় করতে চেয়েছিলেন , না default(DateTime)তাই এটি সর্বোত্তমভাবে বিভ্রান্তিকর। এই "বহুমুখী" হিসাবে আপনি পরোক্ষভাবে, সামগ্রিকভাবে অভিব্যক্তি এখনও একই ধরনের হয়েছে যেহেতু নয় - DateTime, এবং আপনি প্রতিস্থাপন করতে পারেন default(DateTime)সঙ্গে new DateTime()এবং এটি একই জিনিস করতে হবে। সম্ভবত default(DateTime?)আপনি যা বোঝাতে চেয়েছিলেন, যেহেতু এটি আসলে সমান null
IllidanS4 মনিকাকে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.