关于var类型的问题

Dav*_*.ca 0 c#-3.0

我是C#3.0 var类型的新手.这里我有一个关于这种类型的问题.以库中的以下简单代码为例:

 public class MyClass {
    public var Fn(var inValue)
    {
        if ( inValue < 0 )
        {
           return 1.0;
        }
        else 
        { 
           return inValue;
        }
    }
 }
Run Code Online (Sandbox Code Playgroud)

我认为参数是匿名类型.如果我传入一个浮点值,那么Fn应该返回一个浮点类型.如果传入double值类型,Fn会返回double类型吗?如何将整数值类型作为输入值?

实际上,我想使用带有此函数/方法的var类型来动态获取具有各种输入类型的不同返回类型.我不确定这种用法是否正确?

Jon*_*eet 9

您不能var用于返回值或参数类型(或字段).您只能将它用于局部变量.

Eric Lippert有一篇博客文章,说明为什么你不能将它用于田野.我不确定是否有类似的返回值和参数类型.参数类型当然没有多大意义 - 编译器可以从哪里推断出类型?您尝试调用参数的方法是什么?(实际上,这几乎就是F#所做的,但C#更为保守.)

不要忘记这var严格的静态类型 - 它只是让编译器为您推断静态类型的一种方式.它仍然只是一种类型,就像您在代码中键入名称一样.(当然,除了匿名类型,你不能这样做,这是该功能的一个动机.)

编辑:有关详细信息var,您可以在Manning的网站免费下载C#in Depth的第8章- 这包括有关的部分var.显然我希望你会想买这本书,但没有压力:)

编辑:为了实现您的实际目标,您可以使用通用方法实现所有这些目标:

public class MyClass
{
    public T Fn<T>(T inValue) where T : struct
    {
        Comparer<T> comparer = Comparer<T>.Default;
        T zero = default(T);
        if (comparer.Compare(inValue, zero) < 0)
        {
            // This is the tricky bit.
            return 1.0;
        }
        else 
        { 
            return inValue;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如清单所示,棘手的一点是找出"1"对于任意类型的含义.你可以硬编码一组值,但它有点难看:

public class MyClass
{
    private static readonly Dictionary<Type, object> OneValues
        = new Dictionary<Type, object>
    {
        { typeof(int), 1 },
        { typeof(long), 1L },
        { typeof(double), 1.0d },
        { typeof(float), 1.0f },
        { typeof(decimal), 1m },
    };

    public static T Fn<T>(T inValue) where T : struct
    {
        Comparer<T> comparer = Comparer<T>.Default;
        T zero = default(T);
        if (comparer.Compare(inValue, zero) < 0)
        {
            object one;
            if (!OneValues.TryGetValue(typeof(T), out one))
            {
                // Not sure of the best exception to use here
                throw new ArgumentException
                    ("Unable to find appropriate 'one' value");
            }
            return (T) one;
        }
        else 
        { 
            return inValue;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Icky - 但它会起作用.然后你可以写:

double x = MyClass.Fn(3.5d);
float y = MyClass.Fn(3.5f);
int z = MyClass.Fn(2);
Run Code Online (Sandbox Code Playgroud)

等等

  • 哈,我今晚两次击败你.这不会经常发生.我会等待你的优秀编辑:) (2认同)

Joh*_*han 5

您不能将var用作方法的返回类型.