C#: Передающий пустой указатель к перегруженному методу - какой метод называют?

Вы должны различать таблицы Power Query и таблицы модели данных (Power Pivot). Вы можете настроить некоторые таблицы PQ в виде таблиц, загружаемых в DM, поэтому данные будут «переноситься» из PQ в DM только для этих конкретных таблиц.

Я почти уверен, что невозможно получить данные из таблиц «PQ only». Вы можете просто получить m запросов (не их результаты) через VBA или распаковав Excel.

Относительно таблиц PP (DM). На самом деле, в Excel есть движок Analytical Services (VertiPac) (на всякий случай - и внутри PowerBI Desktop). Поэтому, как только вы запускаете Excel или PBI, вы фактически запускаете также экземпляр движка AS. Данные в нем доступны через:

  1. Excel VBA (Visual Basic для приложений). У вас есть API Thisworkbook.Model.DataModelConnection. *, И вы можете получить доступ как к самим данным, так и к модели. Это единственный «официальный» способ получения данных программным способом.

  2. Power Query - как источник данных Analytical Services. Это неофициальный способ, но я читал, что Microsoft сказала, что не собирается закрывать его в будущем (но вы никогда не знаете :-)). Например. Dax Studio может это сделать - https://www.sqlbi.com/tools/dax-studio/ . К сожалению, хотя добраться до службы PBI AS довольно просто, я не знаю, как добраться до службы Excel AS без Dax Studio. Насколько я понимаю, основная проблема заключается в том, как получить номер порта AS, запущенного в Excel. Но я надеюсь, что эта информация, по крайней мере, поможет вам понять путь для дальнейшего поиска, если вы хотите пойти по пути Power Query. Или может быть целесообразно использовать Power BI Desktop для этой задачи.

  3. Excel - это просто zip-файл, поэтому определенно AS-файлы находятся внутри него. Я никогда не шел этим путем, но вы можете наблюдать, что находится внутри exel zip - возможно, файлы AS могут быть там в какой-то полезной форме.

34
задан SWB 5 April 2009 в 19:42
поделиться

3 ответа

Это зависит от TypeA и TypeB.

  • Если точно один из них применим (например, нет никакого преобразования из null кому: TypeB потому что это - тип значения, но TypeA ссылочный тип), затем, вызов будет выполнен к применимому.
  • Иначе это зависит от отношений между TypeA и TypeB.
    • Если существует неявное преобразование из TypeA кому: TypeB но никакое неявное преобразование из TypeB кому: TypeA затем использование перегрузки TypeA будет использоваться.
    • Если существует неявное преобразование из TypeB кому: TypeA но никакое неявное преобразование из TypeA кому: TypeB затем использование перегрузки TypeB будет использоваться.
    • Иначе вызов неоднозначен и не скомпилирует.

Посмотрите раздел 7.4.3.4 из спецификации C# 3.0 для подробных правил.

Вот является пример его не быть неоднозначным. Здесь TypeB происходит из TypeA, что означает, что существует неявное преобразование из TypeB кому: TypeA, но не наоборот. Таким образом использование перегрузки TypeB используется:

using System;

class TypeA {}
class TypeB : TypeA {}

class Program
{
    static void Foo(TypeA x)
    {
        Console.WriteLine("Foo(TypeA)");
    }

    static void Foo(TypeB x)
    {
        Console.WriteLine("Foo(TypeB)");
    }

    static void Main()
    {
        Foo(null); // Prints Foo(TypeB)
    }
}

В целом, даже перед лицом иначе неоднозначного вызова, чтобы гарантировать, что конкретная перегрузка используется, просто бросьте:

Foo((TypeA) null);

или

Foo((TypeB) null);

Обратите внимание, что, если это вовлекает наследование в классы объявления (т.е. один класс перегружает метод, объявленный его базовым классом) Вы в целую другую проблему, и необходимо бросить цель метода, а не аргумента.

71
ответ дан Jon Skeet 27 November 2019 в 16:21
поделиться

Jon Skeet дал всесторонний ответ, но с точки зрения дизайна Вы не должны зависеть от угловых случаев спецификации компилятора. Если ничто иное, если необходимо искать то, что это делает перед записью этого, следующий человек, который попытается считать его, не будет знать то, что это делает также. Это не удобно в сопровождении.

Перегрузки там для удобства, и две различных перегрузки с тем же именем должны сделать то же самое. Если эти два метода делают разные вещи, переименуйте один или они оба.

Это более обычно для перегруженного метода иметь варианты с переменными числами параметров, и для перегрузки с меньшим количеством параметров для предоставления разумных значений по умолчанию.

например. string ToString(string format, System.IFormatProvider provider) имеет большинство параметров,
string ToString(System.IFormatProvider provider) предоставляет формат по умолчанию, и
string ToString() предоставляет формат по умолчанию и поставщика,

8
ответ дан Anthony 27 November 2019 в 16:21
поделиться

неоднозначный вызов. (ошибка времени компиляции).

1
ответ дан Schildmeijer 27 November 2019 в 16:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: