क्या पैरामीटर स्थिर हो सकते हैं?


85

मैं जावा के C # समतुल्य की तलाश कर रहा हूं final। क्या यह मौजूद है?

क्या C # में निम्नलिखित की तरह कुछ भी है:

public Foo(final int bar);

उपरोक्त उदाहरण में, barकेवल पढ़ने योग्य चर है और इसके द्वारा परिवर्तित नहीं किया जा सकता है Foo()। क्या C # में ऐसा करने का कोई तरीका है?

उदाहरण के लिए, हो सकता है मैं एक लंबे विधि के साथ काम किया जाएगा x, yऔर zकिसी वस्तु (ints) के निर्देशांक। मैं पूरी तरह से निश्चित होना चाहता हूं कि फ़ंक्शन इन मानों को किसी भी तरह से नहीं बदलता है, जिससे डेटा दूषित हो जाता है। इस प्रकार, मैं उन्हें आसानी से घोषित करना चाहूंगा।

public Foo(int x, int y, int z) {
     // do stuff
     x++; // oops. This corrupts the data. Can this be caught at compile time?
     // do more stuff, assuming x is still the original value.
}

का डुप्लीकेट stackoverflow.com/questions/2125591/... (और btw एरिक Lippert द्वारा एक महान जवाब है,)
casperOne

12
मुझे नहीं लगता कि इसकी सटीक नकल। यह प्रश्न संदर्भ के माध्यम से अंतर और मूल्य से गुजरने के बीच के अंतर के बारे में है। मुझे लगता है कि रोसेर्क ने उस बिंदु के लिए खराब उदाहरण कोड का उपयोग किया हो सकता है जिसे वह पार करने की कोशिश कर रहा था।
कोरी सनवॉल्ड

@Rosarch: मैं "फाइनल" शब्द से जो कुछ समझ रहा हूं, वह यह है कि आप ऑब्जेक्ट के साथ नामांकित कार्रवाई कर सकते हैं, जो कुछ भी हो सकता है। मैं समझता हूं कि एक वर्ग पर लागू "अंतिम" सी # में "सील" की समानता होगी। लेकिन इस खोजशब्द "फ़ाइनल" का लाभ या वास्तविक उपयोग वैसे भी क्या है? मैंने इसे लगभग किसी भी जगह एक जावा स्रोत कोड में किसी दिन देखा है।
विल मार्कॉइलर

3
@Will मार्कोइलर अंतिम कीवर्ड के साथ वह वस्तु नहीं है जो परिवर्तित नहीं हो सकती है, क्योंकि आप उस विधि का उपयोग कर सकते हैं जो ऑब्जेक्ट के आंतरिक भाग में बदल जाती है, वस्तु का संदर्भ जो बदल नहीं सकता है। मान स्थिति द्वारा पास के मामले में, उदाहरण दिया गया था, जैसे कि यह x ++ को एक वैध संचालन होने से रोकेगा क्योंकि मूल्य बदल रहा होगा। फायदा यह होगा कि आपको यह सुनिश्चित करने के लिए कि कुछ भी अलग होने का मूल्य निर्धारित करने के लिए एक संकलित समय विवेक की जांच हो। हालांकि, मेरे अनुभव में मुझे ऐसी सुविधा की कभी जरूरत नहीं पड़ी।
कोरी सनवॉल्ड

+1 @Corey Sunwold: इस परिशुद्धता के लिए धन्यवाद। अभी के लिए, मैं केवल C # और JAVA के बीच के युग्मों को जानता हूं, यह जानकर कि C # "JAVA को अपनी अवधारणाओं में विरासत में मिला है"। इसने कहा, यह मुझे जेएवीए के बारे में अधिक जानने के लिए प्रोत्साहित करता है क्योंकि मुझे पता है कि यह दुनिया भर में अच्छी तरह से फैला हुआ है।
विल मार्कॉइलर

जवाबों:


62

दुर्भाग्य से आप C # में ऐसा नहीं कर सकते।

constकीवर्ड केवल स्थानीय चर और क्षेत्रों के लिए इस्तेमाल किया जा सकता।

readonlyकीवर्ड केवल खेतों पर इस्तेमाल किया जा सकता।

नोट: जावा भाषा भी एक विधि के लिए अंतिम मापदंडों का समर्थन करती है। यह कार्यक्षमता C # में मौजूद नहीं है।

से http://www.25hoursaday.com/CsharpVsJava.html

EDIT (2019/08/13): मैं इसे दृश्यता के लिए फेंक रहा हूं क्योंकि यह स्वीकार किया जाता है और सूची में उच्चतम है। यह अब inमापदंडों के साथ संभव है । देखें जवाब जानकारी के लिए इस एक नीचे।


1
"दुर्भाग्य"? यह वर्तमान क्षमता से कैसे भिन्न होगा?
जॉन सॉन्डर्स

31
@ जॉन सौन्डर्स दुर्भाग्यशाली हैं क्योंकि रोसार्क एक ऐसी सुविधा की तलाश कर रहे हैं जो मौजूद नहीं है।
कोरी सनवोल्ड

7
@ जॉन: यह विधि के भीतर स्थिर नहीं है। वह मुद्दा है।
दोपहर रेशम

6
इस पद्धति के दायरे के बाहर इसकी एकमात्र स्थिरांक है। यह देखते हुए कि क्या यह संदर्भ या मूल्य द्वारा पारित किया गया था, रोसार्च नहीं चाहता कि पैरामीटर विधि के दायरे में बदल जाए। अहम अंतर है।
कोरी सनवोल्ड

5
@ सिल्की: उनके पोस्ट को पढ़ते हुए, यह वह नहीं है जो वह पूछ रहा है। वह यह सुनिश्चित करने के लिए कह रहा है कि विधि वास्तविक मापदंडों को न बदले।
जॉन सॉन्डर्स

32

यह अब C # संस्करण 7.2 में संभव है:

आप inविधि हस्ताक्षर में कीवर्ड का उपयोग कर सकते हैं । MSDN प्रलेखन

inएक प्रणाली के तर्क को निर्दिष्ट से पहले जोड़ा जाना चाहिए।

उदाहरण, C # 7.2 में एक मान्य विधि:

public long Add(in long x, in long y)
{
    return x + y;
}

जबकि निम्नलिखित की अनुमति नहीं है:

public long Add(in long x, in long y)
{
    x = 10; // It is not allowed to modify an in-argument.
    return x + y;
}

निम्नलिखित त्रुटि को तब दिखाया जाएगा जब या तो संशोधित करने का प्रयास किया जाएगा xy वे या कर रहे हैं या जब से वे चिह्नित हैं in:

'लॉन्ग' में वेरिएबल को असाइन नहीं किया जा सकता क्योंकि यह एक आसानी से वेरिएबल है

के साथ एक तर्क चिह्नित करना inसाधनों के :

यह विधि इस पैरामीटर के रूप में उपयोग किए गए तर्क के मूल्य को संशोधित नहीं करती है।


4
बेशक, यह संदर्भ प्रकारों के लिए उपयोगी नहीं है। inउन प्रकार के मापदंडों के लिए कीवर्ड का उपयोग करना , केवल उन्हें असाइन करने से रोकें। अपने सुलभ खेतों या संपत्तियों को संशोधित करने से न रोकें! क्या मैं सही हू?
ABS

5
कृपया ध्यान दें कि यह केवल संरचना / मूल्यों के साथ अच्छी तरह से काम करता है और कक्षाओं के साथ नहीं, जहां आप उस उदाहरण को संशोधित कर सकते हैं जो रेफरी द्वारा है इसलिए यह बहुत बुरा है। और आपको कोई चेतावनी नहीं मिलती है। सावधानी से प्रयोग करें। blog.dunnhq.com/index.php/2017/12/15/…
jeromej

8

यहाँ एक छोटा और मीठा जवाब है जो शायद बहुत सारे वोटों को प्राप्त करेगा। मैंने सभी पोस्ट और टिप्पणियों को नहीं पढ़ा है, इसलिए कृपया मुझे क्षमा करें यदि यह पहले सुझाया गया है।

अपने मापदंडों को क्यों न लें और उन्हें एक ऐसी वस्तु के रूप में पारित करें जो उन्हें अपरिवर्तनीय के रूप में उजागर करता है और फिर उस वस्तु का अपने तरीके से उपयोग करता है?

मुझे लगता है कि यह संभवतः एक बहुत ही स्पष्ट कार्य है जिसके बारे में पहले ही विचार किया जा चुका है और ओपी इस सवाल को पूछकर ऐसा करने से बचने की कोशिश कर रहा है, लेकिन मुझे लगा कि यह यहाँ होना चाहिए और कम नहीं ...

सौभाग्य :-)


1
क्योंकि सदस्य अभी भी संशोधित किए जा सकते हैं। यह c ++ कोड दिखाता है कि int* p; *p = 0;:। यह संकलित गलती तक संकलित और चलाएगा।
कोल जॉनसन

मैंने वोट दिया क्योंकि यह समस्या का हल नहीं है। आप फ़ंक्शन सिर पर तर्कों को भी सहेज सकते हैं और अंत में उनकी तुलना कर सकते हैं, और परिवर्तन पर एक अपवाद फेंक सकते हैं। मैं अपनी पिछली जेब में रखने के लिए जा रहा हूँ कि अगर कभी सबसे खराब समाधान प्रतियोगिता है :)
रिक ओ'शिआ

8

उत्तर: C # में C ++ जैसी कास्ट फंक्शनलिटी नहीं है।

मैं बेनेट डिल से सहमत हूं।

Const कीवर्ड बहुत उपयोगी है। उदाहरण में, आपने एक int का उपयोग किया है और लोगों को आपकी बात समझ में नहीं आती है। लेकिन, क्यों अगर आप पैरामीटर उपयोगकर्ता की विशाल और जटिल वस्तु है जिसे उस फ़ंक्शन के अंदर नहीं बदला जा सकता है? यह कॉन्स्टेबल कीवर्ड का उपयोग है: पैरामीटर उस पद्धति के अंदर नहीं बदल सकता है क्योंकि [यहाँ जो भी कारण है] जो उस पद्धति के लिए मायने नहीं रखता है। कॉन्स्ट कीवर्ड बहुत शक्तिशाली है और मैं वास्तव में इसे सी # में याद करता हूं।


7

मैं intभाग के साथ शुरू करूँगा । intएक मूल्य प्रकार है, और .Net में जिसका अर्थ है कि आप वास्तव में एक प्रति के साथ काम कर रहे हैं। किसी विधि को बताने के लिए यह वास्तव में अजीब डिजाइन बाधा है "आपके पास इस मूल्य की एक प्रति हो सकती है। यह आपकी प्रति है, मेरी नहीं; मैं इसे फिर कभी नहीं देखूंगा। लेकिन आप प्रतिलिपि को बदल नहीं सकते।" यह पद्धति कॉल में निहित है जो इस मान की प्रतिलिपि बनाना ठीक है, अन्यथा हम सुरक्षित रूप से विधि नहीं कह सकते। यदि विधि को मूल की आवश्यकता है, तो इसे बचाने के लिए एक प्रतिलिपि बनाने के लिए इसे कार्यान्वयनकर्ता पर छोड़ दें। या तो विधि को मूल्य दो या विधि को मूल्य मत दो। बीच-बीच में सभी इच्छा-वाश न करें।

चलो संदर्भ प्रकारों पर चलते हैं। अब यह थोड़ा भ्रमित हो जाता है। क्या आपका मतलब एक निरंतर संदर्भ है, जहां संदर्भ को स्वयं बदला नहीं जा सकता है, या पूरी तरह से बंद, अपरिवर्तनीय वस्तु? यदि पूर्व, डिफ़ॉल्ट रूप से .Net में संदर्भ मूल्य द्वारा पारित किए जाते हैं। यही है, आपको संदर्भ की एक प्रति मिलती है। इसलिए हमारे पास अनिवार्य रूप से वैसी ही स्थिति है जैसे मूल्य प्रकारों के लिए। यदि कार्यान्वयनकर्ता को मूल संदर्भ की आवश्यकता होगी तो वे इसे स्वयं रख सकते हैं।

बस हमें निरंतर (लॉक / अपरिवर्तनीय) वस्तु के साथ छोड़ देता है। यह एक रनटाइम परिप्रेक्ष्य से ठीक लग सकता है, लेकिन संकलक इसे लागू करने के लिए कैसे है? चूंकि गुण और विधियां सभी दुष्प्रभाव हो सकती हैं, आप अनिवार्य रूप से केवल-पढ़ने के लिए क्षेत्र तक ही सीमित रहेंगे। इस तरह की वस्तु बहुत दिलचस्प होने की संभावना नहीं है।


2
मैंने आपको गलतफहमी के लिए प्रश्न को गलत ठहराया; यह कॉल के बाद मूल्य को बदलने के बारे में नहीं है, लेकिन इसे बदलकर।
दोपहर सिल्क 3

2
@ सिल्की - मुझे सवाल गलत नहीं लगा। मैं फंक्शन में भी बात कर रहा हूं। मैं कह रहा हूं कि यह एक समारोह में भेजने के लिए एक अजीब प्रतिबंध है, क्योंकि यह वास्तव में कुछ भी नहीं रोकता है। यदि कोई मूल पैरामीटर भूल जाता है तो वे बदल जाते हैं, बस एक कॉपी बदल जाने की संभावना होती है।
जोएल कोएहॉर्न

1
मैं असहमत हूं। नीचे की ओर व्याख्या करते हुए एक टिप्पणी प्रदान करें।
दोपहर सिल्क

डेटटाइम में केवल-केवल फ़ील्ड एक्सेस होती है, लेकिन यह अभी भी दिलचस्प है। इसकी कई विधियाँ हैं जो नए उदाहरण लौटाती हैं। कई कार्यात्मक भाषाएं साइड-इफेक्ट वाले तरीकों से बचती हैं और अपरिवर्तनीय प्रकारों को पसंद करती हैं, मेरी राय में यह कोड का पालन करना आसान बनाता है।
डेविन गार्नर

दिनांक समय अभी भी एक मान प्रकार है, न कि संदर्भ प्रकार।
जोएल कोएहॉर्न

5

अपनी कक्षा के लिए एक इंटरफ़ेस बनाएँ जिसमें केवल आसानी से संपत्ति एक्सेसर्स हों। तब आपका पैरामीटर क्लास के बजाय उस इंटरफ़ेस का होगा। उदाहरण:

public interface IExample
{
    int ReadonlyValue { get; }
}

public class Example : IExample
{
    public int Value { get; set; }
    public int ReadonlyValue { get { return this.Value; } }
}


public void Foo(IExample example)
{
    // Now only has access to the get accessors for the properties
}

स्ट्रक्चर्स के लिए, एक जेनेरिक कास्ट रैपर बनाएं।

public struct Const<T>
{
    public T Value { get; private set; }

    public Const(T value)
    {
        this.Value = value;
    }
}

public Foo(Const<float> X, Const<float> Y, Const<float> Z)
{
// Can only read these values
}

हालांकि यह ध्यान देने योग्य है कि यह अजीब है कि आप वह करना चाहते हैं जो आप स्ट्रक्चर्स के संबंध में करने के लिए कह रहे हैं, क्योंकि विधि के लेखक से आपको यह जानने की उम्मीद करनी चाहिए कि उस पद्धति में क्या चल रहा है। यह विधि के भीतर उन्हें संशोधित करने के लिए पास किए गए मानों को प्रभावित नहीं करेगा, इसलिए आपकी एकमात्र चिंता यह सुनिश्चित कर रही है कि आप अपने द्वारा लिखी गई विधि में स्वयं व्यवहार करें। एक बिंदु आता है जहां सतर्कता और साफ कोड कुंजी और ऐसे अन्य नियमों को लागू करने के लिए महत्वपूर्ण है।


यह वास्तव में बहुत चालाक है। इसके अलावा, मैं यह नोट करना चाहता हूं कि आप एक ही समय में कई इंटरफेस प्राप्त कर सकते हैं - लेकिन आप केवल एक ही श्रेणी प्राप्त कर सकते हैं।
नताली एडम्स

यह मददगार है ... और इसी तरह से इसे # से गायब होने की झुंझलाहट से छुटकारा दिलाता है। धन्यवाद
Jimmyt1988

3

यदि आप अक्सर इस तरह की परेशानी में रहते हैं, तो आपको "एप्स" पर विचार करना चाहिए। अच्छी किस्म, बुरे किस्म के विपरीत । हालांकि यह आम तौर पर एक विधि पैरामीटर के निरंतर-नेस को व्यक्त करने की कोशिश नहीं करता है (जो कि बहुत ही असामान्य है), निश्चित रूप से ऐसा कुछ भी नहीं है जो आपको पहचानकर्ता नाम से पहले एक अतिरिक्त "सी" से निपटने से रोकता है।

अब डाउनवोट बटन को स्लैम करने के लिए उन सभी के लिए, कृपया इस विषय पर इन प्रकाशकों की राय पढ़ें:


ध्यान दें कि आपको इसे लागू करने के लिए किसी नामकरण सम्मेलन की आवश्यकता नहीं है; आप हमेशा इस तथ्य के बाद विश्लेषण उपकरण का उपयोग कर सकते हैं (महान नहीं, लेकिन फिर भी)। मेरा मानना ​​है कि Gendarme ( mono-project.com/Gendarme ) के पास इसके लिए एक नियम है, और शायद StyleCop / FxCop भी।
दोपहर सिल्क 3

आसानी से एक समाधान में सबसे खराब प्रयास (विफल)। तो अब आपका पैरामीटर न केवल लिखने योग्य है, यह आपको असफल होने के लिए झूठ बोलकर स्थापित कर रहा है इसके बारे में नहीं बदला है।
रिक ओ'शिआ

अब तक दो उपयोगकर्ताओं को प्राप्त करने से बदतर हो सकता है।
हंस पैसेंट

2

मुझे पता है कि इसमें थोड़ी देर हो सकती है। लेकिन जो लोग अभी भी इसके लिए अन्य तरीके खोज रहे हैं, उनके लिए C # मानक की इस सीमा के आसपास एक और तरीका हो सकता है। हम रैपर क्लास ReadOnly <T> लिख सकते हैं जहां T: संरचना है। बेस प्रकार टी के निहितार्थ रूपांतरण के साथ लेकिन रैपर <T> वर्ग के लिए केवल स्पष्ट रूपांतरण। यदि कंपाइलर त्रुटियों को लागू करेगा, यदि डेवलपर ReadOnly <T> प्रकार के मान को सेट करने का प्रयास करता है। जैसा कि मैं नीचे दो संभावित उपयोग प्रदर्शित करूंगा।

परिवर्तन के लिए 1 आवश्यक कॉलर परिभाषा का उपयोग करें। यह उपयोग केवल आपके "TestCalled" फ़ंक्शन कोड की शुद्धता के लिए परीक्षण में उपयोग होगा। रिलीज के स्तर पर / निर्माण करते समय आपको इसका उपयोग नहीं करना चाहिए। चूंकि बड़े पैमाने पर गणितीय कार्य रूपांतरणों में हावी हो सकते हैं, और आपके कोड को धीमा कर सकते हैं। मैं इसका उपयोग नहीं करूंगा, लेकिन प्रदर्शन के उद्देश्य से ही मैंने इसे पोस्ट किया है।

उपयोग 2 जो मैं सुझाऊंगा, उसमें टेस्टकॉलड 2 फ़ंक्शन में प्रदर्शित डिबग बनाम रिलीज़ उपयोग है। इस दृष्टिकोण का उपयोग करते समय TestCaller फ़ंक्शन में कोई रूपांतरण नहीं होगा, लेकिन इसके लिए संकलक कंडीशनिंग का उपयोग करके TestCaller2 परिभाषाओं के कोडिंग की थोड़ी अधिक आवश्यकता होती है। आप डिबग कॉन्फ़िगरेशन में कंपाइलर त्रुटियों को नोटिस कर सकते हैं, जबकि रिलीज़ कॉन्फ़िगरेशन पर TestCalled2 फ़ंक्शन में सभी कोड सफलतापूर्वक संकलित करेंगे।

using System;
using System.Collections.Generic;

public class ReadOnly<VT>
  where VT : struct
{
  private VT value;
  public ReadOnly(VT value)
  {
    this.value = value;
  }
  public static implicit operator VT(ReadOnly<VT> rvalue)
  {
    return rvalue.value;
  }
  public static explicit operator ReadOnly<VT>(VT rvalue)
  {
    return new ReadOnly<VT>(rvalue);
  }
}

public static class TestFunctionArguments
{
  static void TestCall()
  {
    long a = 0;

    // CALL USAGE 1.
    // explicite cast must exist in call to this function
    // and clearly states it will be readonly inside TestCalled function.
    TestCalled(a);                  // invalid call, we must explicit cast to ReadOnly<T>
    TestCalled((ReadOnly<long>)a);  // explicit cast to ReadOnly<T>

    // CALL USAGE 2.
    // Debug vs Release call has no difference - no compiler errors
    TestCalled2(a);

  }

  // ARG USAGE 1.
  static void TestCalled(ReadOnly<long> a)
  {
    // invalid operations, compiler errors
    a = 10L;
    a += 2L;
    a -= 2L;
    a *= 2L;
    a /= 2L;
    a++;
    a--;
    // valid operations
    long l;
    l = a + 2;
    l = a - 2;
    l = a * 2;
    l = a / 2;
    l = a ^ 2;
    l = a | 2;
    l = a & 2;
    l = a << 2;
    l = a >> 2;
    l = ~a;
  }


  // ARG USAGE 2.
#if DEBUG
  static void TestCalled2(long a2_writable)
  {
    ReadOnly<long> a = new ReadOnly<long>(a2_writable);
#else
  static void TestCalled2(long a)
  {
#endif
    // invalid operations
    // compiler will have errors in debug configuration
    // compiler will compile in release
    a = 10L;
    a += 2L;
    a -= 2L;
    a *= 2L;
    a /= 2L;
    a++;
    a--;
    // valid operations
    // compiler will compile in both, debug and release configurations
    long l;
    l = a + 2;
    l = a - 2;
    l = a * 2;
    l = a / 2;
    l = a ^ 2;
    l = a | 2;
    l = a & 2;
    l = a << 2;
    l = a >> 2;
    l = ~a;
  }

}

बेहतर होगा कि रीडऑनली स्ट्रक्चर होगा और वीटी स्ट्रक्चर और क्लास दोनों हो सकता है, इस तरह अगर वीटी स्ट्रक्चर है तो वैल्यू से वैल्यू पास होगी और अगर क्लास है तो वैल्यू रेफरेंस से पास होगी और अगर आप चाहें तो इसे पसंद कर सकते हैं जावा के अंतिम संचालक ReadOnly को अंतर्निहित होना चाहिए।
तोमर वोल्बर्ग

0

यदि संरचना को एक विधि में पारित किया जाता है, जब तक कि इसे रेफ द्वारा पारित नहीं किया जाता है, तो इसे उस विधि द्वारा परिवर्तित नहीं किया जाएगा जिसे इसे पारित किया गया है। तो इस मायने में, हाँ।

क्या आप ऐसा पैरामीटर बना सकते हैं जिसका मान विधि के भीतर नहीं रखा जा सकता है या जिनके गुण विधि के भीतर सेट नहीं किए जा सकते हैं? नहीं। आप मूल्य को विधि के भीतर नियत होने से नहीं रोक सकते, लेकिन आप इसे अपरिवर्तनीय प्रकार का निर्माण करने से रोक सकते हैं।

सवाल यह नहीं है कि क्या पैरामीटर या इसके गुण विधि के भीतर सौंपे जा सकते हैं। सवाल यह है कि विधि से बाहर निकलने पर यह क्या होगा।

यदि आप किसी कक्षा को पास करते हैं और उसमें से किसी एक गुण को बदलते हैं, या यदि आप रेफ कीवर्ड का उपयोग करके कोई मान पास करते हैं, तो केवल एक बार ही बाहर का डेटा बदल दिया जाएगा। आपके द्वारा उल्लिखित स्थिति न तो है।


मैं +1 अपरिवर्तनीयता के बारे में टिप्पणी को छोड़कर ... एक अपरिवर्तनीय प्रकार होने से वह पूरा नहीं कर पाएगा जो वह खोज रहा है।
एडम रॉबिन्सन

निश्चित रूप से यह डिफ़ॉल्ट रूप से होगा। एक अपरिवर्तनीय प्रकार, जिसे संदर्भ द्वारा पारित नहीं किया गया है, यह सुनिश्चित करेगा कि विधि, विधि के बाहर, परिवर्तन नहीं करता है।
डेविड मॉर्टन

1
सच है, लेकिन उसका उदाहरण विधि के अंदर मूल्य को बदलने के बारे में है। अपने उदाहरण कोड में, x एक Int32 है, जो अपरिवर्तनीय है, लेकिन फिर भी उसे लिखने की अनुमति है x++। यही है, वह पैरामीटर के पुनर्मूल्यांकन को रोकने की कोशिश कर रहा है, जो कि पैरामीटर के मूल्य की पारस्परिकता के लिए रूढ़िवादी है।
itowlson

1
@ सिल्की किंडा ने तीन सवालों के जवाब देने में अजीब बात कही कि एक ही सवाल को गलत समझा। शायद यह पाठक की गलती नहीं है सवाल गलत समझा गया था। तुम्हें पता है, जब एक आदमी अपनी तीसरी पत्नी को तलाक देता है, तो यह आमतौर पर पत्नियों की गलती नहीं होती है।
डेविड मोर्टन

2
@ डेविड: यह मतदान प्रणाली का उद्देश्य है। प्रासंगिकता द्वारा आदेश देने के लिए। मैं यह नहीं देखता कि आपको इसे सही करने की चिंता क्यों करनी चाहिए।
दोपहर सिल्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.