আমি লাম্বদা এক্সপ্রেশনগুলিতে নাল প্রচারের অপারেটরটি কেন ব্যবহার করতে পারি না?


104

আমি প্রায়শই আমার কোডে নাল প্রচারকারী অপারেটর ব্যবহার করি কারণ এটি আমাকে আরও পাঠযোগ্য কোড দেয়, বিশেষত দীর্ঘ প্রশ্নগুলিতে আমাকে ব্যবহৃত প্রতিটি একক বর্গকে বাতিল করতে হবে না।

নিম্নলিখিত কোডটি একটি সংকলন ত্রুটি ছুঁড়ে ফেলেছে যা আমরা লাম্বডায় নাল প্রচারকারী অপারেটরটি ব্যবহার করতে পারি না।

var cnt = humans.AsQueryable().Count(a => a.House?[0].Price == 5000);

ভূল :

ত্রুটি CS8072 একটি এক্সপ্রেশন ট্রি ল্যাম্বডায় নাল প্রচারকারী অপারেটর নাও থাকতে পারে।

সি # সহজেই অন্য কিছু করতে না পারলে উপরের কোডটি কোডের উপরের কোডটি সহজেই অনুবাদ করতে পারে!

var cnt = humans.AsQueryable().Count(a => a.House != null && a.House[0].Price == 5000);

আমি আগ্রহী কেন সি # কিছু না করে এবং কেবল একটি সংকলক ত্রুটি ছুঁড়ে দেয়?


4
Foo?.Barএর সমান নয় Foo != null ? Foo.Bar : nullকারণ Fooএকবার নাল-প্রচারকারী অপারেটরের সাথে মূল্যায়ন করা হয় এবং শর্তসাপেক্ষে দুবার, সুতরাং অনুবাদটি সব ক্ষেত্রেই সঠিক হবে না।
লুকাশ ট্রাজেসনিউস্কি 14'27

4
নোট করুন যে যদি EF এর কোডটি হয় তবে সম্ভাবনা রয়েছে যে আপনার সত্যিই নাল প্রচারকারী অপারেটরের প্রয়োজন নেই, কারণ যখন কোনও কোয়েরি এসকিউএল কলে রূপান্তরিত হয়, এসকিউএল নাল ছুঁড়ে না :-)
xanatos

এনবি: এটি লেখার var q = from c in Categories join p in Products on c equals p.Category into ps from p in ps.DefaultIfEmpty() select new { Category = c, ProductName = (p?.ProductName)??"(No products)"};পরিবর্তে ProductName = (p == null) ? "(No products)" : p.ProductNameলিখতেও দরকারী হবে কারণ ইএফ বর্তমানে ?.অপারেটরকে সমর্থন করে না ।
ম্যাট

উত্তর:


74

এটি জটিল যেহেতু এক্সপ্রেশন ট্রি ল্যাম্বডাস (ডেলিগেট ল্যাম্বডাসের বিপরীতে) ইতিমধ্যে বিদ্যমান লিনকিউ সরবরাহকারীরা ব্যাখ্যা করেছেন যা এখনও নাল প্রচারকে সমর্থন করে না।

শর্তসাপেক্ষ অভিব্যক্তিতে রূপান্তর করা সর্বদা নির্ভুল হয় না কারণ একাধিক মূল্যায়ন থাকে যখন ?.উদাহরণস্বরূপ কেবলমাত্র একক মূল্যায়ন থাকে:

customer.Where(a => c.Increment()?.Name) // Written by the user 
customer.Where(a => c.Increment() == null ? null : c.Increment().Name) // Incorrectly interpreted by an old LINQ provider

প্রাসঙ্গিক মধ্যে গভীর যেতে পারেন CodePlex আলোচনা যেখানে 3 সমাধান দেওয়া হয়: NullPropagationExpression, ConditionalExpressionও একটি সংকর


26
নির্দিষ্ট ক্যোয়ারী সরবরাহকারীরা এটি সমর্থন না করতে পারলে আমি অবশ্যই অবাক হব না, তবে এটি সি # ভাষা সমর্থন না করার কারণ নয়।
পরিবেশন করুন

18
সত্য যে নির্দিষ্ট ক্যোয়ারী প্রদানকারীর এখনো না এটা সমর্থন নিষিদ্ধ করার একটি কারণ নয় সব থেকে ক্যোয়ারী প্রদানকারীর কি কখনো এটিকে ব্যবহার করতে হচ্ছে।
পরিবেশন করুন

11
এবং স্পষ্টতই কোনও জিজ্ঞাসা সরবরাহকারী এই ধরণের অনুরোধটি পরিচালনা করতে সময় নিতে যাবেন না যতক্ষণ না সেই সরবরাহকারীর ব্যবহারকারীরা প্রকৃতপক্ষে এটি উপস্থাপন করে এমন অভিব্যক্তি গাছ তৈরি করতে সক্ষম হবে না। এটি সমর্থিত হওয়ার জন্য, ল্যাম্বডাস এটির প্রতিনিধিত্ব করতে সক্ষম হওয়ার জন্য প্রথমে যেটি হওয়া দরকার। এটি বিদ্যমান থাকার পরে , ক্যোয়ারী সরবরাহকারীরা যথাযথ বলে মনে করে এটি সমর্থন করা শুরু করতে পারে। বিভিন্ন প্রকারের বিভিন্ন ধরণের কাজ করার জন্য প্রচুর সরবরাহকারীও রয়েছে। এটি ইএফের মতো নয় যে বিশ্বের একমাত্র কোয়েরি সরবরাহকারী।
পরিবেশন করুন

8
পুরো বিন্দু এর Expressionকোড হিসেবে শব্দার্থগতভাবে সব C # এর এক্সপ্রেশন প্রতিনিধিত্ব করতে সক্ষম হতে হয়। এটি ভাষার কিছু ছোট উপসেট হিসাবে ডিজাইন করা হয়নি।
পরিবেশন করুন

7
দেখে মনে হচ্ছে এটি 3 বছর পরে এখনও সমাধান করা যায় না - মাইক্রোসফ্টের এতক্ষণে কি সময়টি সন্ধান করা উচিত ছিল না? আজকাল সি # তে নতুন বৈশিষ্ট্য অর্ধ-বাস্তবায়ন করার অজুহাত হিসাবে তাদের সময় এবং সংস্থান ব্যবহার করার খারাপ অভ্যাস রয়েছে বলে মনে হয়।
নেটমেজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.