• C#实现函数根据返回类型重载


    一直以来都很奇怪为何C#不能直接支持函数返回值重载,

    比如如下两个函数是编译不过的

    Public Class DbHelper

    {

      Public Static int ExecuteScalar();

      Public Static string ExecuteScalar();

    }

    今天看到了装配脑袋的这篇博文,里边就实现了我要的效果,而且语法很优美,让我们来拜读一下。

    知识点预习

    Implicit  关键字用于声明隐式的用户定义类型转换运算符。如果可以确保转换过程不会造成数据丢失,则可使用该关键字在用户定义类型和其他类型之间进行隐式转换。

    也就是提供类似 decamil money = 9 的转换功能

    对应的还有一个

    Explicit  关键字用于声明必须使用强制转换来调用的用户定义的类型转换运算符。

    也就是提供类似 int money = (int)9.0 的转换功能

    作者使用简单的一个类 Foo 和 一个结构TestHelper

    需要重载的方法放在Foo类

      private string TestString() 
        { 
            return "I'm a string"; 
        }

       private int TestInt() 
        {
            return 100; 
        }

    TestHelper结构是包装Foo类的

    public struct TestHelper 
        { 
            Foo m_host; 
            public TestHelper(Foo host) 
            { 
                m_host = host; 
            }

        //实现TestHelperint的隐式转换

            public static implicit operator int(TestHelper helper) 
            { 
                return helper.m_host.TestInt(); 
            }

        //实现TestHelperstring的隐式转换

            public static implicit operator string(TestHelper helper) 
            { 
                return helper.m_host.TestString(); 
            } 
        } 

    关键在于Foo类一个巧妙的函数

    Public TestHelper Test() 
        { 

        //返回一个TestHelper对象,由该对象去隐式转换目标值
            return new TestHelper(this); 
        }

    最终调用起来类似

    Foo f = new Foo(); 
    int i = f.Test(); 
    string s = f.Test(); 

    效果达成,无毒无副作用就是多了个类(原文用内部类),收藏。●▽●

  • 相关阅读:
    Using Resource File on DotNet
    C++/CLI VS CSharp
    JIT VS NGen
    [Tip: disable vc intellisense]VS2008 VC Intelisense issue
    UVa 10891 Game of Sum(经典博弈区间DP)
    UVa 10723 Cyborg Genes(LCS变种)
    UVa 607 Scheduling Lectures(简单DP)
    UVa 10401 Injured Queen Problem(简单DP)
    UVa 10313 Pay the Price(类似数字分解DP)
    UVa 10635 Prince and Princess(LCS N*logN)
  • 原文地址:https://www.cnblogs.com/MigCoder/p/3500747.html
Copyright © 2020-2023  润新知