मैं 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
मैं भी इससे स्तब्ध हूँ, मुझे अक्सर फंक्शन कॉल्स में शॉर्ट्स में इनट्स डालना पड़ता है, हालांकि उन्हें कास्टेबल होना चाहिए ...
मैथ्यू डुमौलिन

2
@MathieuDumoulin वे कास्टेबल हैं, इसीलिए आप उन्हें कास्ट कर सकते हैं। लेकिन यह एक लॉसफुल रूपांतरण है (ऐसे कई इनट्स हैं जो थोड़े समय में फिट नहीं होते हैं), इसलिए निहित कास्ट संभव नहीं है, इसीलिए आपको लिखना होगा (short) i
हाबिल

जवाबों:


186

पहले दो लगातार अभिव्यक्ति हैं, पिछले एक नहीं है।

C # विनिर्देशन स्थिरांक से स्थिरांक के लिए एक संक्षिप्त रूपांतरण की अनुमति देता है, लेकिन अन्य अभिव्यक्तियों के लिए नहीं। यह एक उचित नियम है, क्योंकि स्थिरांक के लिए संकलक यह सुनिश्चित कर सकता है कि मूल्य लक्ष्य प्रकार में फिट बैठता है, लेकिन यह सामान्य अभिव्यक्तियों के लिए नहीं हो सकता है।

यह नियम दिशानिर्देश के अनुरूप है कि निहितार्थ दोषरहित होना चाहिए।

6.1.8 निरंतर अभिव्यक्ति रूपांतरण

एक अंतर्निहित निरंतर अभिव्यक्ति रूपांतरण निम्नलिखित रूपांतरणों की अनुमति देता है:

  • एक निरंतर अभिव्यक्ति प्रकार के (§7.18) intटाइप करने के लिए परिवर्तित किया जा सकता sbyte, byte, short, ushort, uint, या ulong, का मूल्य प्रदान की निरंतर अभिव्यक्ति गंतव्य प्रकार की सीमा के भीतर है।
  • प्रकार की एक निरंतर-अभिव्यक्ति को प्रकार में longपरिवर्तित किया जा सकता है ulong, बशर्ते निरंतर-अभिव्यक्ति का मूल्य नकारात्मक न हो।

(C # भाषा विनिर्देश संस्करण 3.0 से उद्धृत)


67

वहाँ से कोई अंतर्निहित रूपांतरण है intकरने के लिए shortकाट-छांट करने की संभावना की वजह से। हालांकि, संकलक द्वारा एक स्थिर अभिव्यक्ति को लक्ष्य प्रकार के रूप में माना जा सकता है ।

1? कोई समस्या नहीं है: यह स्पष्ट रूप से एक वैध shortमूल्य है। i? इतना नहीं - short.MaxValueउदाहरण के लिए यह कुछ मूल्य> हो सकता है , और कंपाइलर सामान्य मामले में इसकी जांच नहीं कर सकता है।


इसलिए ... इससे कोई फर्क नहीं पड़ता कि मैं कितना स्पष्ट हूं ...> _ <। क्या आपके पास कोई विचार है अगर मैं पता लगा सकता हूं कि क्या एक साहित्यिक पारित हो गया था या एक अंतर चर?

@ acidzombie24 आप नहीं कर सकते। लेकिन आप ऐसा क्यों करना चाहेंगे?
एडम हल्ड्सवर्थ

@ acidzombie24 मुझे नहीं लगता कि आप इसका पता लगा सकते हैं। आप हालांकि एक टेम्पलेट तर्क का उपयोग कर सकते हैं और फिर उसके प्रकार पर पहुंचने के लिए प्रतिबिंब का उपयोग कर सकते हैं।
कोनराड रूडोल्फ

3
@ acidzombie24 रनटाइम के दौरान कोई शाब्दिक तरीका पारित नहीं किया जा सकता है। तो आप बस संकलन समय पर जाँच करने के लिए अपनी आँखों का उपयोग कर सकते हैं।
जस्टिन

1
@ acidzombie24 उस मामले में, क्या यह तर्क को स्वीकार करने का विकल्प होगा Expression<Func<int>>? तब आप पास () => 1या () => iफंक्शन कर सकते थे, आप निरीक्षण कर सकते थे कि पास की गई इकाई में एक कैप्चर किया गया वैरिएबल है या कोई स्थिर मान।
कोनराड रुडोल्फ

8

एक int शाब्दिक अर्थ में परिवर्तित किया जा सकता है short। जहाँ तक:

आप अव्यवस्थित रूप से संख्यात्मक प्रकार के बड़े भंडारण आकार को संक्षेप में परिवर्तित नहीं कर सकते हैं

इसलिए, पहले दो काम क्योंकि शाब्दिकों के निहित रूपांतरण की अनुमति है।


3
आपका उत्तर थोड़ा गलत है। आपको शाब्दिक लेकिन स्थिर-अभिव्यक्ति का उपयोग नहीं करना चाहिए । विशेष रूप से दूसरा उदाहरण शाब्दिक नहीं है ।
कोडइन्चोस

6

मेरा मानना ​​है कि यह इसलिए है क्योंकि आप पहले दो में एक शाब्दिक / निरंतर में से गुजर रहे हैं, लेकिन तीसरे में पूर्णांक में पास होने पर स्वचालित प्रकार का रूपांतरण नहीं होता है।

संपादित करें: किसी ने मुझे इसे हराया!


3

क्योंकि नॉनट्राइटल प्रकार से बड़े आकार के शॉर्ट के बीच कोई अंतर्निहित रूपांतरण नहीं होगा ।

स्थैतिक रूपांतरण केवल निरंतर-अभिव्यक्ति के लिए संभव है।

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'

तो यहाँ सवाल आप से पूछना चाहिए: यह रूपांतरण विफल क्यों होता है? मैंने "c # कन्वर्ट इन्ट शॉर्ट" को देखा और shortकीवर्ड के लिए MS C # पेज पर समाप्त हुआ :

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

जैसा कि इस पृष्ठ में कहा गया है, एक बड़े डेटा प्रकार से निहित कास्ट shortकेवल शाब्दिक के लिए अनुमति दी जाती है। कंपाइलर बता सकता है कि एक शाब्दिक सीमा से बाहर है, लेकिन अन्यथा नहीं, इसलिए इसे आश्वस्त करने की आवश्यकता है कि आपने अपने प्रोग्राम लॉजिक में आउट ऑफ रेंज त्रुटि से बचा है। यह आश्वासन एक कलाकार द्वारा प्रदान किया जाता है।

Write((short)i)

0

Int -> शॉर्ट से परिवर्तित करने के परिणामस्वरूप डेटा ट्रंकेशन हो सकता है। इसीलिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.