C# 方法只传递接受的参数值

C# 方法只传递接受的参数值,c#,methods,parameters,parameter-passing,C#,Methods,Parameters,Parameter Passing,假设采用以下方法: int ExtractMedian(int Statistic) { return ExtractionWork; } 例如,可以使用ref强制Statistic仅接受奇数,如1、3、5,但在传递后不检查值吗 是否可以强制统计只接受像1、3、5这样的奇数 例如,使用ref,但在传递后不检查值 不,我不这么认为 我只需在方法开始时检查: int ExtractMedian(int Statistic) { if(Statistic % 2 == 0)

假设采用以下方法:

int ExtractMedian(int Statistic)
{
    return ExtractionWork;
}
例如,可以使用
ref
强制
Statistic
仅接受奇数,如
1、3、5
,但在传递后不检查值吗

是否可以强制
统计
只接受像
1、3、5这样的奇数
例如,使用
ref
,但在传递后不检查值

不,我不这么认为

我只需在方法开始时检查:

int ExtractMedian(int Statistic)
{
    if(Statistic % 2 == 0)
        throw new ArgumentException("Statistic must be odd");

    return ExtractionWork;
}

不,没有办法


代码契约可以用来强制执行此操作,但它们基本上是代码中的后处理步骤,然后可以被分析器用来查看无效调用。它们不是完整的.NET功能的一部分。

您必须在某个地方执行奇数或偶数检查,通常更好的做法是让函数负责检查其输入是否有效

话虽如此,如果这不是一个选项,您可以创建一个奇数类,其值只能是奇数

public class odd {
  int value;
  int get {return value;}
  void set{//check if odd before setting value;}
}

您可以将参数声明为一个类,该类具有从类中的int和check值的隐式转换

public class OddValue  
{  
    private int _value = 1;  
    public int Value  
    {  
        get  
        {  
            return _value;  
        }  

        set
        {  
            if (value % 2 == 0)  
                throw new ArgumentOutOfRangeException();  
            _value = value;  
        }  
    }  

    public OddValue(int value)  
    {  
        this.Value = value;  
    }  
public static implicit operator OddValue(int value)  
    {  
        return new OddValue(value);  
    }  
}  

public static void test(OddValue value)  
    {  

    }  

test(5);  

我不明白ref在这种情况下会有什么帮助。你说的“武力”是什么意思?如果消费者传递了一个偶数,你希望发生什么?好吧,通过使用
ref
,被调用的方法会反映在调用方法中,所以我所说的“例如”,是一种类似于传递
ref参数
@YacoubMassad的方法,类似于试图传递无效参数的无效方法。我不确定我是否理解。您希望抛出异常还是希望出现编译错误,或者确切地说是什么?如果有的话,我建议使用包含int值的不可变结构。请原谅我的无知,但为什么不可变?下面是答案。对于冗长的答案,您可能也希望