C#方法中的静态参数

时间:2014-04-09 10:39:01

标签: c# .net class static clr

我对C#中的方法中的静态类使用有疑问。假设我们在另一个类中有一个带有两个参数int和Enum的方法。

public void DemoMethod(int pricePerTenant , TenantType tenantType){
    //Method implementation    
}

如果我们实现静态类而不是Enum,C#不允许将静态类作为方法参数传递

public static class TenantType
{
   public static readonly int TenantAdmin = 1;
   public static readonly int TenantUser = 2;
   public static readonly int PublicUser = 3;
}

//With static class parameters
public void DemoMethod(int pricePerTenant , TenantType tenantType){
    //Method implementation    
}

为什么C#CLR拒绝将Static类作为参数?

由于

2 个答案:

答案 0 :(得分:9)

您永远无法实例化TenantType - 因此可能传递到DemoMethod的唯一值是null。考虑一下如何调用该方法 - 如果您希望调用(比方说)DemoMethod(10, TenantType.TenantUser)那么那将是一个int参数而不是TenantType

基本上,静态类永远不会有实例,因此允许在任何你考虑实例的地方使用它们是没有意义的 - 包括方法参数和类型参数。你应该感谢C#如此早地发现你的错误,基本上 - 这是静态类的好处之一。

在这种情况下,听起来真的应该有一个枚举:

public enum TenantType
{
    Admin = 1,
    User = 2,
    PublicUser = 3
}

此时你可以接受它作为参数 - 你仍然可以调用DemoMethod(10, TenantType.User),但是以类型安全的方式接受,除非方法真正关心关于整数映射,它永远不会看到它。

答案 1 :(得分:2)

因为如果您指定TenantType tenantType作为参数,那么告诉C#,您需要TenantType实例。而且由于你没有通过,它将不起作用。

反过来,这将:

public void DemoMethod(int pricePerTenant, int tenantType) {

}

DemoMethod(3, TenantType.TenantAdmin);

<强>但即可。有一种类似于你的方法,它实际上可以工作:

public class TenantType {

    private int value;

    private TenantType(int newValue)
    {
        value = newValue;
    }

    public override bool Equals(object obj)
    {
        return (obj is TenantType && (obj as TenantType).value == this.value;
    }

    public override int GetHashCode()
    {
        return value;
    }

    public static bool operator == (TenantType left, TenantType right)
    {
        return left.Equals(right);
    }

    public static bool operator != (TenantType left, TenantType right)
    {
        return !(left.Equals(right));
    }

    public static TenantType Admin = new TenantType(1);
    public static TenantType User = new TenantType(2);
    public static TenantType PublicUser = new TenantType(3);
}

public void DemoMethod(int pricePerTenant, TenantType tenantType)
{

}

DemoMethod(4, TenantType.Admin);

如您所见,这需要比使用枚举的最简单解决方案更多的工作(毕竟,这正是它们的创建目的)。