编译后更改返回类型

时间:2014-12-27 14:59:03

标签: c# arrays function return-value

我正在为C#中的项目创建一个类UML,我想知道它是否有可能做某事并想在我开始编写之前检查。

我有一个函数,它获取一个类Array,并根据其索引的'level'int返回其中一个类。它使用的数组将始终是相同的数组,但它包含的类将根据播放器输入而不同。

有没有办法可以将返回类型设置为“未定”之类的东西,然后在函数本身中根据数组[level]中的任何类设置返回类型?

谢谢

2 个答案:

答案 0 :(得分:2)

您可以使用dynamic作为返回类型:

动态:

动态类型是在C#4.0中引入的。动态类型间接使用System.Object,但它不需要在运行时对任何操作进行显式类型转换,因为它仅在运行时标识类型。

enter image description here

在上面的代码中,我们在变量中分配各种类型的值,因为它的类型是动态的,并且动态延迟确定类型直到执行。所有动态类型变量都在运行时享受派对。

dynamic返回类型的示例:

class ExampleClass
{
    // A dynamic field. 
    static dynamic field;

    // A dynamic property.
    dynamic prop { get; set; }

    // A dynamic return type and a dynamic parameter type. 
    public dynamic exampleMethod(dynamic d)
    {
        // A dynamic local variable.
        dynamic local = "Local variable";
        int two = 2;

        if (d is int)
        {
            return local;
        }
        else
        {
            return two;
        }
    }
}


namespace DynamicExamples
{
    class Program
    {
        static void Main(string[] args)
        {
            ExampleClass ec = new ExampleClass();
            Console.WriteLine(ec.exampleMethod(10));
            Console.WriteLine(ec.exampleMethod("value"));

            // The following line causes a compiler error because exampleMethod 
            // takes only one argument. 
            //Console.WriteLine(ec.exampleMethod(10, 4));

            dynamic dynamic_ec = new ExampleClass();
            Console.WriteLine(dynamic_ec.exampleMethod(10));

            // Because dynamic_ec is dynamic, the following call to exampleMethod 
            // with two arguments does not produce an error at compile time. 
            // However, itdoes cause a run-time error.  
            //Console.WriteLine(dynamic_ec.exampleMethod(10, 4));
        }
    }
// Results: 
// Local variable 
// 2 
// Local variable

答案 1 :(得分:2)

dynamicObject返回类型都有效(尽管Object仅适用于非原始数据类型)

您可能希望将creating an interface视为返回类型,并在可能的返回值类中实现它。

interface IReturnType
{
  void Do();
}

并且:

class AReturnType : IReturnType
{
  void Do()
  {
    //do something
  }
}

class BReturnType : IReturnType
{
  void Do()
  {
    //do something else
  }
}

用法是:

List<IReturnType> MyFunction( List<ConstantClass> constantClasses );

编辑:这不会在编译时改变返回类型,它只是一种不同的方法:)