আমি কেন সংক্ষিপ্ত হিসাবে 1 পাস করতে পারি, তবে ইনট ভেরিয়েবল আমি না?


146

কেন প্রথম এবং দ্বিতীয় লিখতে কাজ করে তবে শেষ হয় না? আমি কি তাদের কোনও 3 টির অনুমতি দিতে পারি এবং এটি 1, (ইনট) 1 বা আমি পাস করেছিলাম তা সনাক্ত করতে পারি? এবং সত্যিই কেন একজনকে শেষ ছাড়া অনুমতি দেওয়া হচ্ছে? দ্বিতীয়টি অনুমোদিত হচ্ছে তবে শেষটি আসলে আমার মনকে আঘাত করে না।

সংকলন ত্রুটি দেখানোর জন্য ডেমো

using System;
class Program
{
    public static void Write(short v) { }
    static void Main(string[] args)
    {
        Write(1);//ok
        Write((int)1);//ok
        int i=1;
        Write(i);//error!?
    }
}

2
আমিও এতে স্ট্যাম্পড আছি, আমাকে প্রায়শই ফাংশন কলগুলিতে শর্ট করতে হয় যদিও তাদের castালাই করা উচিত ...
ম্যাথিউ ডুমুলিন

2
@ ম্যাথিউডুমুলিন তারা castালাইযোগ্য, এজন্যই আপনি তাদের কাস্ট করতে পারেন। তবে এটি একটি লোকসান রূপান্তর (অনেকগুলি অন্তর্নির্মিত সংক্ষিপ্ত আকারে খাপ খায় না), সুতরাং অন্তর্নিহিত castালাই সম্ভব নয়, এজন্য আপনাকে লিখতে হবে (short) i
আবেল

উত্তর:


186

প্রথম দুটি ধ্রুবক প্রকাশ, শেষটি নয় one

সি # স্পেসিফিকেশনটি ধ্রুবকগুলির জন্য অন্তর্ থেকে সংক্ষিপ্ত রূপে অন্তর্নিহিত রূপান্তরটির অনুমতি দেয় তবে অন্যান্য অভিব্যক্তির জন্য নয়। এটি একটি যুক্তিসঙ্গত নিয়ম, যেহেতু ধ্রুবকগুলির জন্য সংকলকটি নিশ্চিত করতে পারে যে মানটি টার্গেটের ধরণের সাথে খাপ খায় তবে এটি স্বাভাবিক প্রকাশের জন্য পারে না।

এই নিয়মটি সেই গাইডলাইনটির সাথে সামঞ্জস্যপূর্ণ যে অন্তর্নিহিত রূপান্তরগুলি ক্ষতিহীন হওয়া উচিত।

6.1.8 অন্তর্ভুক্ত ধ্রুবক অভিব্যক্তি রূপান্তর

একটি অন্তর্নিহিত ধ্রুবক অভিব্যক্তি রূপান্তরটি নিম্নলিখিত রূপান্তরগুলির অনুমতি দেয়:

  • একটি ধ্রুবক প্রকাশ ধরনের (§7.18) intটাইপ করতে পরিবর্তিত করা যায় sbyte, byte, short, ushort, uint, অথবা ulong, এর মান প্রদান করা ধ্রুবক প্রকাশ গন্তব্য টাইপ এর পরিসীমা মধ্যে হয়।
  • একটি ধ্রুবক প্রকাশ ধরনের longটাইপ পরিবর্তিত করা যায় ulongপ্রদান মান ধ্রুবক প্রকাশ নেতিবাচক নয়।

(সি # ভাষা স্পেসিফিকেশন সংস্করণ 3.0 থেকে উদ্ধৃত)


67

সেখানে থেকে কোনো অন্তর্নিহিত রূপান্তর হয় intথেকে shortছাঁটাই সম্ভাবনার কারণ। যাইহোক, একটি ধ্রুবক অভিব্যক্তি সংকলক দ্বারা লক্ষ্য ধরণের হিসাবে গণ্য করা যেতে পারে ।

1? কোনও সমস্যা নয়: এটি স্পষ্টভাবে একটি বৈধ shortমান। i? এত বেশি নয় - short.MaxValueউদাহরণস্বরূপ এটি কিছু মান হতে পারে> এবং সংকলকটি সাধারণ ক্ষেত্রে এটি পরীক্ষা করতে পারে না।


সুতরাং ... আমি কতটা স্পষ্ট তা বিবেচ্য নয় ...> _ <। যদি আপনি সনাক্ত করতে পারি যে কোনও লিটারিয়াল উত্তীর্ণ হয়েছে বা কোনও int পরিবর্তনশীল কিনা তা যদি আপনার কোনও ধারণা থাকে?

@ acidzombie24 আপনি পারবেন না। তবে আপনি কেন এটি করতে চান?
অ্যাডাম হল্ডসওয়ার্থ

@ অ্যাসিডজম্বি 24 আমি মনে করি না আপনি এটি সনাক্ত করতে পারেন। আপনি করতে পারেন তবে একটি টেমপ্লেট যুক্তি ব্যবহার করি এবং তারপর প্রতিফলন ব্যবহার এটির টাইপ এ জন্য।
কনরাড রুডল্ফ

3
@ অ্যাসিডজম্বি 24 রানটাইমের সময় কোনও আক্ষরিক প্রবেশ করার উপায় নেই। তাই আপনি সংকলনের সময় পরীক্ষা করতে কেবল আপনার চোখ ব্যবহার করতে পারেন।
জাস্টিন

1
@ অ্যাসিডজম্বি 24 সেক্ষেত্রে যুক্তিটিকে কী হিসাবে গ্রহণ করার বিকল্প হবে Expression<Func<int>>? তারপর আপনি পাস পারে () => 1বা () => iএবং ফাংশন ভিতরে আপনি পরিদর্শন করতে পারে পাস সত্তা একটি বন্দী পরিবর্তনশীল বা ধ্রুবক রয়েছে যার মান অন্তর্ভুক্ত কি না।
কনরাড রুডলফ

8

একটি int আক্ষরিক স্পষ্টত রূপান্তরিত হতে পারে short। যেখানে:

আপনি স্পষ্টতই বৃহত্তর স্টোরেজ আকারের ননলিটারাল সংখ্যাসমূহকে সংক্ষেপে রূপান্তর করতে পারবেন না

সুতরাং, প্রথম দুটি কাজ কারণ আক্ষরিকের অন্তর্নিহিত রূপান্তর অনুমোদিত।


3
আপনার উত্তরটি কিছুটা ভুল। আপনার আক্ষরিক কিন্তু ধ্রুবক-অভিব্যক্তি ব্যবহার করা উচিত নয় । বিশেষত দ্বিতীয় উদাহরণটি আক্ষরিক নয়
কোডসইনচাউস

6

আমি বিশ্বাস করি এটি কারণ আপনি প্রথম দুটিতে আক্ষরিক / ধ্রুবক দিয়ে যাচ্ছেন তবে তৃতীয়টিতে পূর্ণসংখ্যায় যাওয়ার সময় স্বয়ংক্রিয় ধরণের রূপান্তর নেই।

সম্পাদনা: কেউ আমাকে এতে মারধর করেছে!


3

কারণ কোন না অন্তর্নিহিত মধ্যে রূপান্তর Nonliteral বৃহত্তর সংক্ষিপ্ত আকারের জন্য টাইপ করুন।

অন্তর্নিহিত রূপান্তর কেবল ধ্রুবক-প্রকাশের জন্যই সম্ভব।

public static void Write(short v) { }

যেখানে আপনি integerযুক্তি হিসাবে মান পাস করছেনshort

int i=1;
Write(i);  //Which is Nonliteral here

3

সংকলকটি আপনাকে বলেছে কেন কোডটি ব্যর্থ হয়:

cannot convert `int' expression to type `short'

সুতরাং আপনার এখানে প্রশ্ন করা উচিত: কেন এই রূপান্তরটি ব্যর্থ হয়? আমি "সি # রূপান্তর আন্ত সংক্ষিপ্ত" গুগল করেছিলাম এবং shortকীওয়ার্ডটির জন্য এমএস সি # পৃষ্ঠায় এসে পৌঁছেছি:

http://msdn.microsoft.com/en-us/library/ybs77ex4(v=vs.71).aspx

যেমন এই পৃষ্ঠাটি বলেছে, একটি বড় ডেটা প্রকারের অন্তর্নিহিত কাস্টগুলি shortকেবল আক্ষরিক জন্যই অনুমোদিত। সংকলকটি বলতে পারে যে কখন আক্ষরিক সীমার বাইরে থাকে, তবে অন্যথায় নয়, সুতরাং এটির আশ্বাস দরকার যে আপনি আপনার প্রোগ্রামের যুক্তিতে কোনও সীমার বাইরে থাকা ত্রুটি এড়িয়ে গেছেন। সেই আশ্বাসটি একজন কাস্ট দ্বারা সরবরাহ করা হয়েছে।

Write((short)i)

0

ইনট -> সংক্ষিপ্ত রূপান্তরকরণের ফলে ডেটা কাটা হতে পারে। এই জন্য.

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.